串口超时返回时间太长,求指教int OpenComPort(){strCOM COM1// open comm portm_hComm CreateFile
串口超时返回时间太长,求指教
int OpenComPort() { strCOM = "COM1"; // open comm port m_hComm = CreateFile (strCOM, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); //FILE_FLAG_OVERLAPPED if( m_hComm == (HANDLE)(-1)) { //Failed to initialize the com port return 1; } // set comm state DCB dcb; GetCommState( m_hComm, &dcb ); BuildCommDCB( "115200,n,8,1", &dcb ); if( !SetCommState( m_hComm, &dcb)) { //Failed to initialize the com port return 2; } COMMTIMEOUTS timeOut; GetCommTimeouts (m_hComm, &timeOut); //设定读超时 几十秒后串口无反应将认为超时 timeOut.ReadIntervalTimeout = 100; timeOut.ReadTotalTimeoutMultiplier = 50; timeOut.ReadTotalTimeoutConstant = 200; //设定写超时 timeOut.WriteTotalTimeoutMultiplier = 50; timeOut.WriteTotalTimeoutConstant = 100; SetCommTimeouts(m_hComm, &timeOut); //设置超时 SetupComm (m_hComm, 1024, 1024); PurgeComm (m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); if( !WriteFile( m_hComm, input, CmdLen, &dwCount, NULL ) ) // send command { //发送串口数据出错 return 1; } if( !ReadFile( m_hComm, output, 1024, &dwCount, NULL ) ) //在这里超时太长,要花费几十秒的时间才有返回 { //读取串口数据 return 1; } } //请问上面超时花费怎样可以时间减少些 串口
[解决办法] 对于文件操作本来就是比较耗时间的事情 ,但是要10几秒就应该不是读文件超时引起的吧!、
确认下别的地方呗?
或者在readfile前后加个时间看看!
[解决办法] 串口超时的时长是由系统驱动所决定的。你可以把串口的读写放在一个线程中单独完成,然后在主线程中休眠一段时间(timeout时长),等到休眠醒后判断那个线程是否读写完成。一来主界面不会卡主,另一方面有能自己控制超时时长。
[解决办法] 1、专门开一个线程,负责把串口的数据往buffer中存放;
2、主流程从buffer取出数据进行处理。
引用: int OpenComPort() { strCOM = "COM1"; // open comm port m_hComm = CreateFile (strCOM, GENERIC_READ [解决办法] GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); //FILE_FLAG_OVERLAPPED if( m_hComm == (HANDLE)(-1)) { //Failed to initialize the com port return 1; } // set comm state DCB dcb; GetCommState( m_hComm, &dcb ); BuildCommDCB( "115200,n,8,1", &dcb ); if( !SetCommState( m_hComm, &dcb)) { //Failed to initialize the com port return 2; } COMMTIMEOUTS timeOut; GetCommTimeouts (m_hComm, &timeOut); //设定读超时 几十秒后串口无反应将认为超时 timeOut.ReadIntervalTimeout = 100; timeOut.ReadTotalTimeoutMultiplier = 50; timeOut.ReadTotalTimeoutConstant = 200; //设定写超时 timeOut.WriteTotalTimeoutMultiplier = 50; timeOut.WriteTotalTimeoutConstant = 100; SetCommTimeouts(m_hComm, &timeOut); //设置超时 SetupComm (m_hComm, 1024, 1024); PurgeComm (m_hComm, PURGE_TXABORT [解决办法] PURGE_RXABORT [解决办法] PURGE_TXCLEAR [解决办法] PURGE_RXCLEAR); if( !WriteFile( m_hComm, input, CmdLen, &dwCount, NULL ) ) // send command { //发送串口数据出错 return 1; } if( !ReadFile( m_hComm, output, 1024, &dwCount, NULL ) ) //在这里超时太长,要花费几十秒的时间才有返回 { //读取串口数据 return 1; } } //请问上面超时花费怎样可以时间减少些[解决办法] 引用: 是卡在ReadFile那里了。一直没返回,如果串口上的外设没通电的话。 这种现象能不能改变? if( !ReadFile( m_hComm, output, 1024, &dwCount, NULL ) ) //我猜想是这里的原因了, //你这里的1024是个问题,它没有读到1024个字节可能阻塞在读就没有返回! //这里的1024你看能不会不要一下子读这么多字节,分批读,或者只读有效的数据吧
[解决办法] 推荐使用portmon软件辅助调试串口通信程序。
[解决办法] 串口有1024数据么可读么?
看看系统errno是啥
[解决办法] strCOM = "COM1"; 这个不是一定的吧 即便是同一个串口 也不一定每次都是这个值啊 最好是自己配置 或者做个心跳什么的 先确定他能通信
[解决办法] 这个原因比较多。可以设定一个超时时间的signal。将读取放到线程里面。放到主线程阻塞了影响进度
[解决办法] 引用: Quote: 引用: 串口有1024数据么可读么? 看看系统errno是啥 是串口上数据有多少字节就读多少字节,但最多只能读1024.也看不出什么问题来 是不是1024确实太大了 我这儿使用的才64 读起来也没问题