串口通讯 多线程 异步 架构
现有条件:上位机PC与下位机单片机通讯,通过指令控制单片机输出AD,高低电平等。
协议为:帧头+数据+校验码
两种模式:1,上位机发送一帧 下位必须回送一帧,若没收到回送,或者受到错误的回送,则重发,若6次都有错误,则报告
错误,系统停止通讯,报告错误
2,上位机发送一帧,不需要下位机回送。在线帧,1s发送一次
我以前的模式是同步模式,将发送接收放在一个函数里面,即发送一帧,等待如100ms后,读串口,有数据读并判断,无数据,在发送,类推。等待100ms时候用 Application->ProcessMessages()来使界面可以处理鼠标响应。
但是我觉得这个模式不好,如发送不需要下位机回送的帧,就不好判断了。如果在定时器发送在线帧,假设在界面点击一个按钮发送数据时,两个产生冲突了怎么办?
所以:如果用异步模式,多线程处理,该怎么设计架构呢?比如开几个线程,分别干什么的,重发机制怎么实现?接收到的数据在哪里处理?
谢谢,谈论一下,大有裨益,忘高人指点!
在别的小类发了一个帖子,刚看到有网络及通讯开发。
[解决办法]
1.建立一个线程,专门负责数据的发送和接受,即发送完数据后,开始等待事件,直到有数据返回,然后对数据进行解析,如果在规定时间内下位机无数据返回则判断超时,重发;如果返回数据解析错误,重发。如此循环,如果6次还没成功,就停止通讯,关闭串口和线程。
2.用个定时器发送命令,时间设置为1000。