![]() |
Wiegand 26bit über COM Schnittstelle erfassen
Hallo
ich suche eine Möglichkeit über die Serielle Schnittstelle die Daten zu erfassen. Dabei würde ich das Datenformat Wiegand26 (26bit) bekommen. Wie liest man solche Daten ein, denn soweit ich hier im Forum gesehen habe, kann man nur Bytegrößen angeben. Dann ist es ja auch so, dass ich nur Daten empfange und keine sende. Geht das, und wie mit RAD Studio 2007? |
Re: Wiegand 26bit über COM Schnittstelle erfassen
Am einfachsten ist du besorgst die eine Klasse (TComPort o.ä.), die für dich die Arbeit mit der Kommunikation abnimmt. (vielleicht existiert die auch schon in den neueren Delphi Versionen)
Dann musst du nur noch den Datenstrom in 26-Bit Stücke zerteilen (da dürfte noch ein Beitrag zu in der CodeLib-Warteschleife stehen) |
Re: Wiegand 26bit über COM Schnittstelle erfassen
Danke ich versuche es damit! Wenn ich nicht weiter komme, melde ich mich wieder.
Danke! |
Re: Wiegand 26bit über COM Schnittstelle erfassen
Zitat:
dem kann ich mich nicht anschliessen. Erstens kommen die 26 bit am Stück, lassen sich also über eine asynchrone Schnittstelle ÜBERHAUPT NICHT einlesen - nirgends Start und Stopbits, und asynchrone Schnittstellen mit 26bit Wortlänge sind mir auch noch nicht begegnet. Zweitens kommen Einsen und Nullen auf 2 verschiedenen Leitungen, und das Timing dafür darf in einem weiten Bereich streuen. Wie soll das mit einem Comport gehen??? Das ist eher eine typische Aufgabe für ein Prozessorchen etwa aus der PIC-Reihe. Trotzdem viel Erfolg, Gruss Reinhard |
Re: Wiegand 26bit über COM Schnittstelle erfassen
Das Wiegand26 protokoll kommt ja auch aus dem RS485 Bereich. Dafür gibt es extra einen Wiegand2TCPIP Converter. Dieser kommuniziert aber nur mit einem virtuellen COM-port (Treiber). Den gleichen Effekt erziele ich mit dem RS485 auf RS232 Converter. Das ist aber auch gleichzeitig das Problem, denn 26 bit ist halt ein "krummes" Byte :-)
|
Re: Wiegand 26bit über COM Schnittstelle erfassen
Guten Abend,
ich weiß ja nicht, wie hoch das Datenaufkommen ist? Wenn der Datenfluß hoch genug wäre, könnte es sich lohnen immer 8 x 26 Bit (26 x 1 Byte)zu laden und diese dann in der Nachverarbeitung wieder auseinanderdröseln. Grüße Klaus |
Re: Wiegand 26bit über COM Schnittstelle erfassen
Es kann sein, dass nur ein 26bit Block kommt und dann minutenlang nichts. Da ich es aber in "Echtzeit" (also nicht Minuten später) auswerten möchte, ist das Warten wohl keine gute Wahl.
|
Re: Wiegand 26bit über COM Schnittstelle erfassen
.. ja, das ist verständlich.
Kannst Du dir die Daten im Hyperterminal (o.ä) anschauen/mitschneiden und schauen ob da wirklich nur 26 Bit ankommen oder doch 32 Bit wobei dann 6 Bits nicht beachtet werden? Wenn dann doch mehrere Blöcke am Stück kommen, kann man dann nicht die Bitanzahl div 26 rechnen um die Anzahl der Blöcke zu ermitteln und dann entsprechend trennen.
Code:
Wiegand Output Protocol
The Wiegand protocol (26 bit mode) itself is made up of a leading even parity bit (for b0 - b11), 24 bits of data (from transponder data) and a trailing odd parity bit (for b12- b23). The 36 bit mode has the same format except 34 bits are used to form the data sequence. For example:- Converted BCD data: 00 00 04 60 22 12 75 (14 digits) Truncated BCD data: 04 60 22 12 75 (10 digits) Wiegand 26 bit sequence:- E (b0 --------- b11) (b12 -------- b23) O E ( 0 4 6 0 2 2 ) O 1 0000 0100 0110 0000 0010 0010 1 Where E is EVEN parity bit for bit 0 to 11 and O is ODD parity bit for bits 12 to 23 ![]() Grüße Klaus |
Re: Wiegand 26bit über COM Schnittstelle erfassen
Also meine Versuche im Hyperterminal endeten immer mit einem "y" mit 2 Punkten drauf. Kann man im Hyperterminal denn noch andere Daten sehen?
|
Re: Wiegand 26bit über COM Schnittstelle erfassen
Wenn du nur Lesen mußt, dann könntest du es ja auch erstmal so versuchen.
Das Programm ließt vom COM-Port Byteweise ein und gibt die Werte Hexadezimal aus.
Delphi-Quellcode:
Program Project1;
{$APPTYPE CONSOLE} Uses Windows, SysUtils; Var S: String; H: THandle; B: Byte; C: LongWord; Begin Try Write('Gib die Nummer des COM-Ports ein: '); ReadLn(S); S := Trim(S); H := CreateFile(PChar('COM' + S), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); If H = INVALID_HANDLE_VALUE Then Raise Exception.CreateFmt('Port COM%s konnte nicht geöffnet werden.'#13#10, [S, SysErrorMessage(GetLastError)]); While ReadFile(H, B, 1, C, nil) and (C = 1) do Write(Format('%.2x ', [B])); WriteLn; WriteLn(SysErrorMessage(GetLastError)); CloseHandle(H); Except On E: Exception do WriteLn(E.ClassName, ': ', E.Message); End; ReadLn; End. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz