首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

串口通讯 多线程 异步 架构解决思路

2012-04-16 
串口通讯多线程异步 架构现有条件:上位机PC与下位机单片机通讯,通过指令控制单片机输出AD,高低电平等。协议

串口通讯 多线程 异步 架构
现有条件:上位机PC与下位机单片机通讯,通过指令控制单片机输出AD,高低电平等。
协议为:帧头+数据+校验码
两种模式:1,上位机发送一帧 下位必须回送一帧,若没收到回送,或者受到错误的回送,则重发,若6次都有错误,则报告
  错误,系统停止通讯,报告错误
  2,上位机发送一帧,不需要下位机回送。在线帧,1s发送一次
我以前的模式是同步模式,将发送接收放在一个函数里面,即发送一帧,等待如100ms后,读串口,有数据读并判断,无数据,在发送,类推。等待100ms时候用 Application->ProcessMessages()来使界面可以处理鼠标响应。
但是我觉得这个模式不好,如发送不需要下位机回送的帧,就不好判断了。如果在定时器发送在线帧,假设在界面点击一个按钮发送数据时,两个产生冲突了怎么办?

所以:如果用异步模式,多线程处理,该怎么设计架构呢?比如开几个线程,分别干什么的,重发机制怎么实现?接收到的数据在哪里处理?

谢谢,谈论一下,大有裨益,忘高人指点!

[解决办法]
我觉得楼主的下位机是不是可以调整一下?

接受到数据就认为在线,而不是只有接受到在线帧才认为在线?

这样,发送需要回应的数据的时候,上位机每1秒判断一下,上次发送数据时什么时候,如果大于1秒,就发送在线帧,否则,就不发送。

这样也不用异步发送数据了,更简单了
[解决办法]
就用串口异步通讯,我们上位机只管发送、接受命令的。
我当时就是创建一个线程负责数据的发送和读取,发送一个数据后,等待,然后读取数据,解析,再根据结果进行相应操作。
或许我做的比你的简单,因为我这里没有发送在线帧的问题,但是用异步通讯总是没错的吧?串口调试助手能基本满足你的要求不?我看了下你的要求,应该就是多了个发送在线帧吧?在线帧的命令和其他命令格式是不是一样的呢?如果不是一样的话,就对命令做个判断,然后再发送时进行相应处理就是。

热点排行