一个很顽固的问题,关于串口操作

lotuson 2008-11-12 03:15:54
请大家看看下面代码(csdn的朋友提供的,具体在哪拷贝的不记得了)

//以下是读串口方法中的部分代码
………………
clock_t start;
start=clock();
int i=0;
for(;;)
{
ClearCommError(idComDev,&dwErrors,&lpCommStat);//关键是这行代码
i++;
if (dwErrors|| lpCommStat.cbInQue) /* byte received or error ? */
{
break;
}
else if(clock()-start>1000) /* time out 4 clock ticks */
{
*ErrorNumber = -3;
return(0);
}
}
………………
在我单步调试的时候,ClearCommError函数每次都执行得很顺利,一次就能通过,并得到缓冲区的字节数lpCommStat.cbInQue不为0
而如果去掉所有断点,直接运行后,通过返回的计数器值(即代码中的i)发现只有很少次能顺利执行,绝大部分时候ClearCommError函数要重试几万少也要几千次才能得到缓冲区字节数。。导致我读串口的速度很慢很慢。
翻来覆去调了一天了,请朋友们帮帮我!谢谢了
...全文
190 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lotuson 2008-11-13
  • 打赏
  • 举报
回复
楼上的建议应该是不错的,我也考虑过线程,不过由于时间关系我不能深入学习
现在使用Sleep()函数解决延时问题了,先结贴,谢谢了
leafold 2008-11-12
  • 打赏
  • 举报
回复
楼主这段代码放在线程里面就不会有什么问题了。
yumikoo 2008-11-12
  • 打赏
  • 举报
回复
for(;;)
{
Application->ProcessMessages();
ClearCommError(idComDev,&dwErrors,&lpCommStat);//关键是这行代码
i++;
if (dwErrors|| lpCommStat.cbInQue) /* byte received or error ? */
{
break;
}
else if(clock()-start>1000) /* time out 4 clock ticks */
{
*ErrorNumber = -3;
return(0);
}
Application->ProcessMessages();
}
lotuson 2008-11-12
  • 打赏
  • 举报
回复
to:Turntogo

打开串口时进行了设置

COMMTIMEOUTS timeouts;

//………………

timeouts.ReadIntervalTimeout=100;
timeouts.ReadTotalTimeoutMultiplier=3000;
timeouts.ReadTotalTimeoutConstant=3000;
timeouts.WriteTotalTimeoutMultiplier=3000;
timeouts.WriteTotalTimeoutConstant=3000;
if(!SetCommTimeouts(idComDev,&timeouts))
return (HANDLE)-3;
星光伴月 2008-11-12
  • 打赏
  • 举报
回复
可以设置一下串口设置的超时参数,比如100毫秒。
lotuson 2008-11-12
  • 打赏
  • 举报
回复
谢谢楼上的

代码中给出的1秒重试算不算认为延时?我再去查查看

另补充:

发现发送一串字符后,都是接收第一个字节时延时较长,实验的结果,第一个字节接收延时828ms,其他字节接收在15ms和16ms两个值之间浮动
yumikoo 2008-11-12
  • 打赏
  • 举报
回复
代码就不仔细看了,估计你的通讯接收过程里没有延迟的概念吧?
串口另一边接收到你发送过去的信息要反应并且要回发,这样的话,是有一个时间延迟过程的。
如果忽略这个过程而去实时的读取缓冲区的话,成功率不高的,因为PC的运算速度肯定高于串口传播速度的。
如果你已经考虑到了延迟,那我白说。
如果没有考虑到,你可以去网上看下通讯接收时人为延迟等待的用法。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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