Events / Alarme in der seriellen Kommunikation
-
05-07-2019 - |
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); }
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);
}
}