WriteFile() und ReadFile() asynchron, nicht schreiben oder Lesen
Ich versuche zum senden und empfangen von strings über eine serielle Verbindung mit der writefile
und readfile
Funktionen. Ich habe dazu asynchron, weil die Anzahl der zu lesenden bytes wird immer unterschiedlich sein und readfile
wird einfach hängen oder blockieren Sie so lange, bis er diejenigen, die die korrekte Anzahl von bytes. Nun, ich bin versucht, dies zu tun asynchron meine writefile
Funktion nicht senden Sie meine Daten und meine readfile
Funktion gerade angezeigt wird, übersprungen werden, weil die nächste Zeile beginnt es tun, ohne irgendein Zeichen Lesen. Nicht sicher, ob es ein problem mit meinem Overlapped-Struktur oder meine timeouts. Aber ich bin stecken in diesem moment.
Timeouts
void Serial::OpenPortRead()
{
HANDLE sSerial = CreateFile(L"COM3",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
//Timeout Settings
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(sSerial, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout = 5000;
CommTimeouts.ReadTotalTimeoutMultiplier = 2;
CommTimeouts.ReadTotalTimeoutConstant = 10;
CommTimeouts.WriteTotalTimeoutMultiplier = 50;
CommTimeouts.WriteTotalTimeoutConstant = 500;
//Port Settings
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
dcbSerialParams.BaudRate=CBR_19200;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
SetCommState(sSerial,&dcbSerialParams);//Apply Settings to Handle
}
Write-Datei-Funktion
void Serial::WritePort(CString buffer)
{
DWORD bytes;//pointer to hold number of bytes written
USES_CONVERSION;
CW2A buf((LPCWSTR)buffer);//Convert unicode to ascii
OpenPortRead();
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
WriteFile(sSerial, buf,strlen(buf),&bytes,&overlapped_structure);//Send string
}
Datei Lesen Funktion
int Serial::ReadPort(CString buf){
OpenPortRead();//Open Serial Communication for reading
const int buffer_size = 10;
char buffer[10];//buffer to hold recieved string
memset (buffer, 0, buffer_size * sizeof (char));
int n, num,iTemp,i=0;
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
DWORD bytesRead;//pointer to number bytes read
ReadFile(sSerial,&buffer,buffer_size,&bytesRead,&overlapped_structure);//begin read
//Used this function because return would be filled with extra raw data characters
buffer[n] = StringLength(buffer, &n);//find length of string returned
num = n;
- Nach WriteFile/ReadFile Sie müssen warten, für überlappende Veranstaltung.
- Danke für die Antwort, aber vielleicht ein Beispiel, um mir zu helfen
- Der Punkt von overlapped I/O ist, dass es schließt später und das Programm laufen lassen können, während es im Gange ist. Warten Sie es vollständig entfernt den Punkt mit der es in den ersten Platz. Was auch immer Ihr problem sein mag, overlapped I/O ist nicht die Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
MSDN enthält ausführliche Informationen zur Verwendung von overlapped I/O mit dem seriellen Anschluss Kommunikation:
Serielle Kommunikation