Ich habe es jetzt einmal so Probiert... ich wusste nicht genau was du damit meinst, aber die Procedure sieht so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| procedure TForm1.CommPortDriver1ReceiveData(Sender: TObject; DataPtr: Pointer; DataSize: Cardinal); var i,check : integer; WahreLaenge: cardinal ; begin repeat repeat CommPortDriver1.ReadChar(ch); until ch = StartDelimiter; setlength(msg,DataSize); WahreLaenge := CommPortDriver1.ReadData(pchar(msg),DataSize); CommPortDriver1.PausePolling; checksum := 27; check:= 0; checksum := checksum + ord (msg[1]); case msg[1] of 'Z': begin n := 16; msgType := 'Position'; end; 'W': begin n := 5; msgType := 'Druckknopf'; end; 'U': begin n := 1; msgType := 'Zeitabgelaufen'; end; end;
for i := 1 to n do begin checksum := checksum + ord (msg[i]); end;
for i := 18 to 20 do begin check:=strtoint(msg[i]); end; checksum:= checksum mod 256; until checksum = check; CommPortDriver1.FlushBuffers( true,false); CommPortDriver1.ContinuePolling; end; |
Im ersten Teil wartet er, bis der von mir bestummene StartDelimiter ( chr(2) ) gefunden wird. Dann liest er ein... aber leider nicht immer genug, sondern manchmal 2Zeichen, manchmal 10Zeichen...
eigentlich sollte der empfang folgender massen aussehen nach dem StartDelimiter:
ZABCDEFGHIJKLMNOP253 (Wenn ein Z der erste Buchstabe ist, dann ist der String immer so lang)
W2164 (Wenn ein W der erste Buchstabe ist, siehts so aus)
U1161 (Nicht anderst beim U)
d.h. die Checksumme wird auch noch gleich angehängt
Diese Sachen möchte ich nun verarbeiten mit der oberen Procedure... Was stimmt dabei nicht?
Bin um jeden Input dankbar...
Gruss
Pascal