Hallo Leute!
Ich habe da mal eine wahrscheinlich dumme

Frage zur Kommunikation mit COM-PORTS.
Und zwar versuche ich mit folgendem Code den COM1 zu öffnen, und ein paar Daten aus'm Port in einen Puffer zu laden: Aber diese kleine Test-Prozedur läuft net. Denn bei ReadFile gibt es einen heftigen Speicher-E/A-Fehler mit dem Inhalt "Zugriffsverletzung bei Adresse ...".
Was macht diese Prozedur falsch? (Ist leider nicht meine, sondern aus'm Netz.)
Denn auch meine eigene kleine Test-Prozedur (s.u.) kann nicht vom COM1 lesen, da sie dabei erst hängen bleibt und später abstürzt, obwohl der Port geöffnet ist.
Wer kann mir sagen, warum das Programm nicht von diesem Speicherbereich lesen kann? Ich krieg hier
noch graue Haare!

Schließlich hat's doch damals im ASM unter DOS auch geklappt.
Also wenn's jemand weiß - Bitte melden! "Danke" sag ich deshalb schon mal im Voraus.
Gruß T.M.
PS: Ich verwende WinXP & Delphi5
und: Ist es egal ob man das zu öffnende Gerät nun "COM1" oder "COM1:" nennt?
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:
| procedure TForm1.Button1Click(Sender: TObject); var hCommFile : THandle; TimeoutBuffer : PCOMMTIMEOUTS; NumberOfBytesRead : dword; Buffer : array[0..255] of char; begin // Gibt das Handle zum Port bzw. der Datei zurück hCommFile := CreateFile(PChar('COM1'), GENERIC_READ, //Hier evtl. einen anderen Parameter setzen 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hCommFile = INVALID_HANDLE_VALUE)then // Fehler; Kein gültiges Handle!
// Wenn man vom ComPort liest sollte man auch diese Zeilen benutzen. // Wenn man darauf schreibt, sollt man auch noch WriteTotalTimeoutMultiplier und
WriteTotalTimeoutConstant setzen GetMem(TimeoutBuffer, sizeof(COMMTIMEOUTS));
GetCommTimeouts(hCommFile, TimeoutBuffer^); TimeoutBuffer.ReadIntervalTimeout := 100; TimeoutBuffer.ReadTotalTimeoutMultiplier := 100; TimeoutBuffer.ReadTotalTimeoutConstant := 100; SetCommTimeouts(hCommFile, TimeoutBuffer^);
FreeMem(TimeoutBuffer, sizeof(COMMTIMEOUTS));
// Schließlich lesen wir vom Port bzw. der Datei FillChar(Buffer, sizeof(Buffer), #0); ReadFile(hCommFile, Buffer, sizeof(Buffer), NumberOfBytesRead, nil);
// Das Handle zum Port bzw. der Datei wieder schließen, // und sie somit wieder für andere Programme zugänglich machen. CloseHandle(hCommFile); end; |
Meine eigene kleine Prozedur: Ohne Anschluss-Einstellungen und so. (Nur Stanard)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); Var F:File of Char; Res:Integer; C:Char; begin FileMode:=0; AssignFile(F,'COM1'); {$I-} Reset(F); {$I+} IF IOResult=0 Then Begin Read(F,C); // hier kommt immer "Versuch hinter dem Dateiende zu lesen". D.h. keine Infos am Port??? ShowMessage(C); CloseFile(F); End; FileMode:=2; end; |