Frage

Ich möchte von serial Ereignisse / Interrupts lesen und schreiben. Derzeit habe ich es in einer while-Schleife und es liest kontinuierlich und schreibt über die serielle. Ich will es nur lesen, wenn etwas von der seriellen Schnittstelle kommt. Wie implementiere ich dies in C ++?

Dies ist mein aktueller Code:

    while(true)
    {
        //read
        if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //error occurred. Report to user.
        }

        //write
        if(!WriteFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //error occurred. Report to user.
        }


        //print what you are reading
        printf("%s\n", szBuff);

    }
War es hilfreich?

Lösung

Verwenden Sie eine select Anweisung, die die Lese überprüfen und Puffer schreiben, ohne zu blockieren und dessen Status zurückkehren, so dass Sie nur lesen müssen, wenn Sie wissen, dass die Port-Daten haben, oder schreiben, wenn Sie wissen, dass es Raum in den Ausgangspuffern.

Das dritte Beispiel unter http://www.developerweb.net/forum /showthread.php?t=2933 und die dazugehörigen Kommentare können hilfreich sein.

Edit: Der Mann Seite für ausgewähltes hat ein einfacheres und vollständigeres Beispiel am Ende. Sie können ihn unter http://linux.die.net/man/2/select wenn man 2 select funktioniert nicht auf Ihrem System.

Hinweis: Die Beherrschung select() ermöglicht es Ihnen, mit den beiden seriellen Schnittstellen und Steckdosen zu arbeiten; es ist im Herzen von vielen Netzwerk-Clients und Servern.

Andere Tipps

Für eine Windows-Umgebung des mehr nativen Ansatz wäre, zu verwenden

Hier ist eine Kopie eines Artikel dass in C / C ++ veröffentlicht wurde Benutzer Journal vor ein paar Jahren. Es geht ausführlich auf dem Win32-API.

hier ein Code, den seriellen eingehenden Daten lesen unter Windows mit Unterbrechung Sie können die Zeit während der Warteunterbrechungszeit abgelaufen sehen

int pollComport(int comport_number, LPBYTE buffer, int size) { BYTE Byte; DWORD dwBytesTransferred; DWORD dwCommModemStatus; int n; double TimeA,TimeB; // Specify a set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR ); while (m_comPortHandle[comport_number] != INVALID_HANDLE_VALUE) { // Wait for an event to occur for the port. TimeA = clock(); WaitCommEvent (m_comPortHandle[comport_number], &dwCommModemStatus, 0); TimeB = clock(); if(TimeB-TimeA>0) cout <<" ok "<<TimeB-TimeA<<endl; // Re-specify the set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR); if (dwCommModemStatus & EV_RXCHAR) { // Loop for waiting for the data. do { ReadFile(m_comPortHandle[comport_number], buffer, size, (LPDWORD)((void *)&n), NULL); // Display the data read. if (n>0) cout << buffer <<endl; } while (n > 0); } return(0); } }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top