读书人

串口超时回来时间太长求指教

发布时间: 2013-09-28 10:01:20 作者: rapoo

串口超时返回时间太长,求指教



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 读起来也没问题

读书人网 >C++

热点推荐