串口超时设置的疑问。

ds117 2007-06-28 05:29:39
在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。超时的作用是在指定的时间内没有读入或发送指定数量的字符,ReadFile或WriteFile的操作仍然会结束。
.
.
在进行串口通信时,有两种操作方式,即同步通信和异步通信,也就是阻塞与非阻塞,在同步通信(阻塞)当中,如果ReadFile函数没有读到数据就会一直的读下去,直到读到数据才返回,而异步通信当中,ReadFile如果没有读到数据,就直接反回了,不会等在那里,所以我在想,这个超时主要是针对那种情况来的呢?如果是同步通信的话,程序会阻塞,这个超时还有什么用,因为它会一直等待下去。如果是异步通信,如果ReadFile没有读到数据,它也马上返回了。所以这个超时到里有什么用呢。
.
.
因为我在写程序的时候,向串口发送了一个数据,接下来就从串口里去读数据,以前我是循环去读,比如500次,如果500次没有读到数据就跳出循环,事实上也就是在某一定时间内读串口,如果在这个时间范围内还没有从串口读到数据就说明串口无数据可读了。这个过程以前我是用循环来完成,所以我想在想理解一下这个超时设置,是不是可以通过超时这个设置,用一个ReadFile读就可以完成我上面那个循环的用意了。希望高手们指教!
...全文
2222 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
你個臭鴨蛋 2012-03-15
  • 打赏
  • 举报
回复
不知道LZ搞定没有?我设置了超时, 但是在具体的操作中如果串口没有数据,程序就会死在那儿,超时根本没有用!
xunfeng_2008 2011-04-27
  • 打赏
  • 举报
回复
//设置读写端口超时时间
stCOMMTIMEOUTS.ReadIntervalTimeout = 10000;
stCOMMTIMEOUTS.ReadTotalTimeoutMultiplier = 10000;
stCOMMTIMEOUTS.WriteTotalTimeoutMultiplier = 10000;
stCOMMTIMEOUTS.ReadTotalTimeoutConstant = 10000;//m_dwWaitTime;
stCOMMTIMEOUTS.WriteTotalTimeoutConstant = 10000;
bRetVal = ::SetCommTimeouts(m_hCom, &stCOMMTIMEOUTS);
if( !bRetVal )
{
dwErrCode = ::GetLastError();
//加打印
//ERR(_T("set com timeout fail! nERRCode[%u] \n"), dwErrCode);

//释放资源
::CloseHandle(m_hCom);
m_hCom = NULL;
return dwErrCode;
}




//等待设置的读写事件
Event = WaitForMultipleObjects(3, pComProc->m_hszEvent, FALSE, pComProc->m_dwWaitMilliCount); // pComProc->m_dwWaitTime


///////////////////
这样才是主流
dogandog 2011-04-27
  • 打赏
  • 举报
回复
只是简单的通过超时设置并不能完成你所说的功能,如果想让端口自动检测是否有数据,最好是借助Event事件来实现,而实现所需的两个函数是:WaitCommEvent(),SetCommMask()。

当然,也可以通过创建一个监听线程来实现,判断osRead.HEvent上的事件。
QQ_456 2009-12-14
  • 打赏
  • 举报
回复
up
meiZiNick 2008-04-30
  • 打赏
  • 举报
回复
我也想了解,谢谢LZ.
夏虫…… 2008-04-26
  • 打赏
  • 举报
回复
UINT read(char * buf, int len )

{
DWORD dwCommModemStatus;
DWORD dwErrorFlags;
COMSTAT ComStat;
do{
::GetCommModemStatus(m_hComHandle, &dwCommModemStatus); // 取得串口状态
::WaitCommEvent(m_hComHandle, &dwCommModemStatus, 0); // 等待串口状态改变
}while((dwCommModemStatus & EV_RXCHAR) != EV_RXCHAR); // 直到检测到串口状态为字符输入
::ClearCommError(m_hComHandle, &dwErrorFlags, &ComStat); // 清空串口状态

DWORD dwRead;
ReadFile(m_hComHandle, buf, len, &dwRead, NULL);
return dwRead;
}
同步方式读的话不需要你自己用while来阻塞线程。这个WaitCommEvent会阻塞的。
CathySun118 2007-06-30
  • 打赏
  • 举报
回复
超时容易理解,你可以设置超时
手插兜兜 2007-06-28
  • 打赏
  • 举报
回复
这个你用循环也是解决的一个办法,每次读的之间加一个延时。譬如Sleep(100),不要连续读。具体的超时设置要根据你的设备的响应速度来设置的。现在的计算机,500次循环的时间很短的,即使串口有一定的响应时间,500次的时间也不是很长。以我的经验,你采用这个方式,不如 Sleep()设置延时好。一般都10次以内,超过就判超时。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧