Hardware flow control für serielle Kommunikation
-
Hallo,
möchte gerne über meine zwei COM Schnittstellen Daten von einem Thread zum anderen und dann wieder andere Daten zurückschicken.
Nun habe ich gemerkt, dass ich das ohne Hardware flow control nicht hinbekomme.
(Da es vorkommt, dass der eine Thread lesen will, der andere aber noch gar nicht bereit ist zu schreiben, und somit läuft der Timeout ab und nix gelesen)Wie muss ich nun die "DCB" einstellen, damit alles klappt.
Im moment, z.B. kann der eine Thread nur 1Byte lesen, der andere liest alles.
-
Was hat denn Dein Problem mit Hardware-Flow-Control zu tun?
Wenn der eine nix sendet kann der andere immer in einen Timeout laufen, egal ob Hardware-Flow oder nicht...
-
Ok ich frage mal direkter:
Das ist meine Read Funktion:
int CSerial::ReadData (char *buffer, int iMaxCount) { if (INVALID_HANDLE_VALUE == hComm) { SetLastError(ERROR_INVALID_HANDLE); return(0); } /*Clears the send and receive buffers for COM2*/ DWORD dwFlags = PURGE_TXCLEAR | PURGE_RXCLEAR; PurgeComm(hComm, dwFlags); DWORD dwRead = 0; char chRead; int i = 0; DWORD dwEventMask; if(!SetCommMask(hComm, EV_RXCHAR)) return(1); //Handle Error Condition if(WaitCommEvent(hComm, &dwEventMask, NULL)) { DWORD dwIncommingReadSize; do { if(ReadFile(hComm, &chRead, 1, &dwIncommingReadSize, NULL)!=0) { if(dwIncommingReadSize > 0) { buffer[i++] = chRead; } }else break; //Handle Error Condition } while(dwIncommingReadSize); } return(i); }Sie wartet auf das Event EV_RXCHAR. Wenn also ein Zeichen im receive buffer erscheint, dann liest er es erst, bis dahin sollte er warten.
Mein Problem: der Thread wartet beim ersten mal, wenn ihm nochwas gesendet wird, wartet er nicht sondern geht gleich rein. Ich habe sogar die Puffer geleert, und er geht dennoch rein. Warum nur?
-
Ok habe folgendes herausgefunden:
Thread 1 kann nur senden, aber wenn er was empfangen soll wartet er, weil er das EV_RXCHAR nicht gesetzt bekommt. Lese ich direkt ohne auf EV_RXCHAR zu warten, liest er wunderbar die einzelnen Zeichen.
Thread 2 kann super empfangen, und senden auch. Einzig dass er beim 2.Lesen auf EV_RXCHAR unendlich lange wartet.Kann dieses EV_RXCHAR Flag denn irgendwie wieder gelöscht werden, wie es aussieht ist es blockiert, undzwar immer wenn zuerst das Flag abgefragt wird.