Serielle Schnittstelle abhören



  • Hallo,
    ich muss in einem Programm die ganze Zeit lauschen ob über die Serielle Schnittstelle was gesendet wird und die ankommenden Daten verarbeiten. Wenn ich mit WaitCommEvent oder CommTimeouts arbeite hängt aber immer das ganze Programm, zum Thema Interrupts unter Windows finde ich nirgends etwas, kann mir jemand weiter helfen?

    Gruß Michael



  • am besten im winapi forum fragen, bzw. dort die suchfunktion nutzen.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke für den Tipp. Es sieht also wohl so aus als müsste ich mit threads arbeiten, was ich noch nie geamcht habe. Gibt es eine einfache möglichkeit man schon laufendes Programm in zwei Threads zu trennen. (Ich habe eine Klasse für alles was die serielle Schnittstelle angeht und darin eine Methode zum senden und eine zum empfangen, das funzt auch soweit ganz gut, ausser das halt immer das Programm hängt während ich auf einen Eingang warte, da ich nicht weiß wann die kommt (das angeschlossene Gerät meldet wenn es fertig ist) steht das ganze Programm für unbestimmte Zeit 😡 ) Die Hilfe des Borland C++-Builders 6 zum Thema Threads fand ich nicht aufschlussreich



  • Hallo!

    hast du die timeouts gesetzt?
    öffnest du den port mit CreateFile?

    gruss,
    florian

    ps: muss z.Z. ziemlich das gleiche machen wie du 🙂



  • Soll die serielle Schnittstelle (der COM-Port) von Deinem Programm geöffnet werden oder willst Du einen COM-Port, der von einem anderen Programm geöffnet wurde, überwachen?

    Für den ersten Fall solltest Du den Port mit FILE_FLAG_OVERLAPPED öffnen und den Empfang (ReadFile) in einem eigenen Thread ablaufeb lassen. COMMTIMEOUTS und DCB müssen vollständig gesetzt sein. SetCommState (GetCommState) und SetCommMask (GetCommMask) solltest Du auch anwenden, SetupComm auch. Das Senden wie das Empfangen "overlapped", also alle COM-Port-States abfragen und behandeln.
    Für das Testen ist die Klartext-Ausgabe der Return-Werte aller hier genannten Funktionen sehr hilfreich. Einfach folgenden Code nach der Funktion einbauen (für die Fehlerfälle):

    LPVOID lpMsgBuf;
    	FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    		FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    		NULL, GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
    		(LPTSTR) &lpMsgBuf, 0, NULL);
    	MessageBox (NULL, (LPCTSTR)lpMsgBuf, TEXT("SetupComm failed ..."), 
    		MB_OK | MB_ICONINFORMATION);
    	LocalFree (lpMsgBuf);
    

    Code ist aus der MSDN. Die Fehlerstrings in lpMsgBuf kann man auch in ein Debug- oder Log-File (-Window) schreiben.

    Blackbird


Anmelden zum Antworten