vc 串口通信 未接收到数据超时或者数据不正确 重发 求教

老道_ 2012-12-22 02:02:35
第一次搞这个,pc在线控制软件轮询多子机,当向某个子机发送命令后,在指定时间内未回复或者回复数据不正确进行重发这个机制咋实现?

1、数据不正确好判断
2、未接收到数据,无法激活接收函数,怎么判断?难道在指定时间内,一直查询接收缓冲区为空?如果是这样的话,怎么实现?求教

我采用的是cserial port类,谢谢
...全文
898 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
天上的猩猩Y 2015-07-09
  • 打赏
  • 举报
回复
l楼主。。这没多年过去了。。你的问题应该解决了吧。。今天小弟我也遇到了同样的问题,你能帮帮我吗?能把你的源码发我一份吗?我的邮箱348106906@qq.com
傻X 2012-12-24
  • 打赏
  • 举报
回复
引用 9 楼 tiger9991 的回复:
发送数据的时候附带起定时器(注意定时器编号),在回调函数中kill掉函数即可。
回复以后也需要kill掉定时器,如果超时累计N次就报警。
傻X 2012-12-24
  • 打赏
  • 举报
回复
发送数据的时候附带起定时器(注意定时器编号),在回调函数中kill掉函数即可。
老道_ 2012-12-24
  • 打赏
  • 举报
回复
引用 5 楼 hdg3707 的回复:
数据正确性要靠报文的校验字来判断,这个校验字的计算方式由上位机和下位机共同制定. 开个定时器来判断数据是否在规定时间内未收到
引用 3 楼 arpnet99 的回复:
cserial port应该有一个回调函数吧,应该是个异步的吧。具体没怎么看过这个类,但是我感觉会是只要有数据就能接收到
肯定是有数据到就收到,我的意思是一定时间内没收到数据,比如我发送命令n次,下位机一直没收到,也自然不会回复,那我如何判断? cserial port类中有监听串口线程,关键是我要跟发送命令结合使用,实现上想不到怎么处理好,至于协议啥的都定好的,没问题
hdg3707 2012-12-23
  • 打赏
  • 举报
回复
如果没有找到这个类的回调函数,就开个线程来查询接收数据吧,然后发送自定义命令给主线程
hdg3707 2012-12-23
  • 打赏
  • 举报
回复
数据正确性要靠报文的校验字来判断,这个校验字的计算方式由上位机和下位机共同制定. 开个定时器来判断数据是否在规定时间内未收到
现在还是人类 2012-12-23
  • 打赏
  • 举报
回复
多机通讯必须有一套多机通讯的机制,而这个机制应该在其架构上就解决了这种问题。比如有一种架构,是由主机先发出一个9位的地址码,所有的下位机都能收到这个地址码,然后主机再发送具体的控制数据,只有地址码与先前主机发送的地址码匹配的下位机会做接收和反应,当主机发送完控制数据后,会等待下位机的反馈,如果等待时间超过预定时间,那么表示下位机不存在或出现故障,如果在预定时间内收到下位机的操作反馈,表示通讯成功,至于控制操作是否成功,根据下位机反馈的数据来决定。这样就可以很同意的进行多机通讯了。当然,在PC的控制上,可能有UI界面的介入会影响通讯的固定流程,比如本该是自动轮询所有下位机一一取得他们的状态,但是在控制界面上,却可以点击某个功能按钮促使某个下位机要优先完成某个任务,所以在上位机的程序里,还需要做任务队列,然后根据任务的优先级别排序去执行这种通讯操作,至于任务的优先级别,还可根据同一任务的触发次数来调整。比如有200个下位机终端,操作人员需要立即知道100号终端当前的温度情况,但等轮询任务又太久,所以操作人员可以通过电机100号终端的按钮让系统先处理100号终端的数据,这时本来所有的任务优先级别都是1,但因为操作人员点了一下100号终端的按钮,就把100号终端的优先级别提升到2,然后再根据优先级排序,当处理完当前任务后,接着就会处理100号终端的任务。这时,这种任务队列和排序执行成为了关键。当然,如果你有个总控下位机,把这种任务让总控下位机去处理效率会更高,这就要看你们的下位机是怎么设计的了。
这不是鸭头 2012-12-22
  • 打赏
  • 举报
回复
cserial port应该有一个回调函数吧,应该是个异步的吧。具体没怎么看过这个类,但是我感觉会是只要有数据就能接收到
这不是鸭头 2012-12-22
  • 打赏
  • 举报
回复
有一个线程专门用来判断数据是否正确,通过Event,Semaphore等同步来控制。配合WaitForSingleObject可以设置超时值。
老道_ 2012-12-22
  • 打赏
  • 举报
回复
	m_CommTimeouts.ReadIntervalTimeout = 1000;
	m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
	m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
这个超时参数设置能帮忙吗?

16,472

社区成员

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

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

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