问题描述
本人初学串口通信,要实现一个实时的轮询和控制系统。要求和我看过的某帖类似,就是1、上位机下发的命令比较密集,以200ms周期发送实时状态轮询命令。2、在状态实时轮询命令中间有操作命令插入。3、不同的命令,接收的应答格式也不同。然后我在不同的获取数据的命令中给datareceived订阅了不同的处理函数,这些处理函数结尾又都解除自身的订阅。想问如果处理函数在200ms内不能完成,上位机的命令又来,datareceived会自动触发吗?此时触发的处理函数又是哪个?是当前仍在运行的处理函数还是其他?在别处看到说先收下数据,然后单开一个处理线程去处理数据,但线程不太熟悉,还是没有具体思路。求高手帮忙!
解决方案
解决方案二:
如果是同步的,就不会触发,所以你最好将数据接收到内存,后台开线程,去异步处理
解决方案三:
请问默认是同步还是异步的?我没看见相关的设置选项。按您的意思,我应该在datareceived订阅的处理函数中只进行读取放到内存,然后在后台开线程,去处理内存中的数据是吧。那么我应该对在内存中读取这些数据的代码加锁。虽然现在还没进行过测试,但我觉得如果处理任务很大,有可能超过500ms的读取超时,这时应该怎么办呢?谢谢
解决方案四:
上位机与单片机串口通信一般你发一条请求他给你一个数据所以最好同步接收,异步很难确认哪个单片机返回数据,还有很难确定大于200ms每次的间隔。datareceived是异步接收的,所以单片机给个指令datareceived会从后台线程池取个线程处理。同一个函数多个io线程调用
解决方案五:
你也可以做成同步接收,不使用datareceived,直接开启一个线程,负责数据的发送和接收,每一次通讯前,加锁,以防同时多个地方调用发送数据的函数,保证同一时刻只有一个通讯命令在交互,在这个交互未完成前,其他调用者只能等待。
解决方案六:
我的做法是这样的,给你参考下用DataReceived事件接收,只订阅一个DataReceived事件,但是根据接收到的数据不同,进行不同的处理1、在DataReceived事件中收取数据,将收到的数据存起来2、判断接收到的数据是否符合格式要求3、针对不同的命令进行不同的操作比如:if(命令1),调用函数1if(命令2),调用函数2。。。
解决方案七:
参考一下这个看看能不能解决:http://vsdot.net/2013/04/com-programming.html
解决方案八:
引用5楼leafmao的回复:
我的做法是这样的,给你参考下用DataReceived事件接收,只订阅一个DataReceived事件,但是根据接收到的数据不同,进行不同的处理1、在DataReceived事件中收取数据,将收到的数据存起来2、判断接收到的数据是否符合格式要求3、针对不同的命令进行不同的操作比如:if(命令1),调用函数1if(命令2),调用函数2。。。
我是用timer_tick自动轮流发送3条数据,每个接收格式不一样,想要每发一条之后在DataReceived里面执行你说的这三条,但是每次都是执行一句DataReceived里面的语句就跳回到timer_tick,然后在跳回DataReceived里的第二条,再跳回去,导致发送第二条数据时还在执行接收第一条的语句,你说的只订阅一个DataReceived是怎么回事,怎么样才能发送一条对应接收一条符合格式要求的然后再发下一条?谢谢
解决方案九:
你只有一个串口,订阅多个DataReceived的没有意义的行为如果多个数据之间你无法区分,改为同步发送接收如果数据中带有指令,地址之类的,能够区分不同数据的,你接收到数据之后放到一个List<byte>数组中统一处理一下即可
解决方案十:
而且串口不是以太网,它是半双工的,只能一发一收,你使用异步方式读写,并不能提高效率
解决方案十一:
引用8楼Z65443344的回复:
你只有一个串口,订阅多个DataReceived的没有意义的行为如果多个数据之间你无法区分,改为同步发送接收如果数据中带有指令,地址之类的,能够区分不同数据的,你接收到数据之后放到一个List<byte>数组中统一处理一下即可
不好意思麻烦再问一下怎样改成同步接收,刚刚入门还有很多不懂的