串口通讯 多线程 异步 架构

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

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

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

在别的小类发了一个帖子,刚看到有网络及通讯开发。
...全文
179 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
killking06 2011-03-29
  • 打赏
  • 举报
回复
怎么看不见?
432423423423 2011-02-24
  • 打赏
  • 举报
回复
你说的是用同步还是异步啊,据我所知,同步模式下,不能同时操作串口吧。
还有,我的数据的怎么传递给线程呢?用消息还是用一个缓冲区?比如接收到一帧,怎么传递给串口主线程啊?
看网上是开一个读线程,一个写线程。如果需要重发数据的话,这种方式可以吗?
sxqinge 2011-02-24
  • 打赏
  • 举报
回复
对于第二种模式,再设置个判断条件就可以,比如对哪种命令你不需要下位机返回数据,在第一种模式下发送数据后,sleep(1000),再发。
呵呵或许我说的不周,欢迎拍砖指正
sxqinge 2011-02-24
  • 打赏
  • 举报
回复
1.建立一个线程,专门负责数据的发送和接受,即发送完数据后,开始等待事件,直到有数据返回,然后对数据进行解析,如果在规定时间内下位机无数据返回则判断超时,重发;如果返回数据解析错误,重发。如此循环,如果6次还没成功,就停止通讯,关闭串口和线程。
2.用个定时器发送命令,时间设置为1000。

1,317

社区成员

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

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