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.
InformationsquelleAutor user1704863 | 2013-02-15
Schreibe einen Kommentar