线程读串口的问题
我用的API写的串口读写,在读串口的时候用线程实时读取,
然后用虚拟串口工具设置两个串口COM1 COM2,用程序打开COM1,用串口调试工具打开COM2,2者进行串口通信,
发现在程序读数据的时候,每次都要先写一次,这是为什么????
[解决办法]
- C/C++ code
//打开串口void OpenComm(){ if(bIfopen) AfxMessageBox("串口已经打开!"); else { hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); //创建串口,异步方式 if (hCom == INVALID_HANDLE_VALUE) AfxMessageBox("打开串口失败!"); else { bIfopen = TRUE; SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY ); //设置串口事件 SetupComm( hCom, 4096,4096); //设置读写缓冲区大小 PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); COMMTIMEOUTS comTimeOut; //设置超时 comTimeOut.ReadIntervalTimeout = 100; //两字符之间最大的延时 comTimeOut.ReadTotalTimeoutMultiplier = 50; //读取每字符间的超时 comTimeOut.ReadTotalTimeoutConstant = 1000; //一次读取串口数据的固定超时 comTimeOut.WriteTotalTimeoutMultiplier = 50; //写入每字符间的超时 comTimeOut.WriteTotalTimeoutConstant = 1000; //一次写入串口数据的固定超时 SetCommTimeouts(hCom,&comTimeOut); DCB dcb; GetCommState(hCom, &dcb ); //串口设置 dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fBinary = TRUE; dcb.fParity = FALSE; SetCommState( hCom, &dcb ); } }}
[解决办法]
- C/C++ code
//读取数据int ReadComm(int inum, BYTE* bdata ){ DWORD dwRes; DWORD dwDataRead; Read_OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if ( NULL == Read_OS.hEvent) return -1; if (ReadFile(hCom, bdata, inum, NULL, &Read_OS)) return 0; //成功读出 else { dwRes = WaitForSingleObject(Read_OS.hEvent, 5000); //设置5秒超时 switch(dwRes) { case WAIT_OBJECT_0: if (!GetOverlappedResult(hCom, &Read_OS, &dwDataRead, TRUE)) { //操作失败,可用GetLastError()获取失败信息 return 1; } else { //成功 return 0; } break; case WAIT_TIMEOUT: //超时 return 2; break; default: return 3; break; } } CloseHandle(Read_OS.hEvent); return 0;}
[解决办法]
- C/C++ code
//以事件驱动的读线程DWORD TheardEvent(LPVOID pParam){ BOOL bCommState = TRUE; DWORD deEvtMask, dwRes, dwLength; DWORD dwErrors; COMSTAT ComStat; int i; CString str; BOOL bifwan = FALSE; BYTE bmydata[25]; OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); while (bCommState) { WaitCommEvent(hCom, &deEvtMask, &OS); dwRes = WaitForSingleObject(OS.hEvent, INFINITE); if(WAIT_OBJECT_0 == dwRes) { if(EV_RXCHAR == deEvtMask) { ClearCommError(hCom, &dwErrors, &ComStat); dwLength = ComStat.cbInQue; if (dwLength > 0) { ReadComm(dwLength, bmydata); } memcpy(&Buffer[igbal], bmydata, dwLength); igbal += dwLength; for (i=0; i<(int)dwLength; i++) { if(0x16 == bmydata[i]) bifwan = TRUE; } if(bifwan) { ::PostMessage(HWND(mainhandle), WM_DEBUG, 0, 0); bifwan = FALSE; } } } } return 0;}
[解决办法]