裸机串口接收不定长数据讨论是否使用DMA

        串口接收不定长的两种方式:

        1. 串口接收中断,一次接收一个字节,进入中断指针+1,再开启中断。接下来两种处理方式。 

                a. 通过定时器计算空闲时间,比如说modbus rtu 两个连续的字节超过20ms认为无效,超过200ms认为报文结束。这样我们可以用中断嵌套的方式(接收中断套定时器中断)来实现,但是这个过程一个字节用两个中断一个字节用两个中断,数据量一大就会影响整体的实时性,尤其是开了好多个中断的情况,影响巨大,可能出现很多bug,而且不好查。 

                b. 通过空闲中断做整个报文的结束标志,也是中断嵌套,但是是通过接收中断接收一个字节,接收中断接收一个字节......空闲中断处理接收的数据.....接收中断......这样的优点是中断次数少了(相对),对实时性影响也较小。但是相对modbus rtu的协议规定显然不能判断报文状态了,需要在空闲中断进行数据判断了,根据报文内容去判断报文是否完整等等(上一个也需要做)。

        2. DMA+空闲中断,一次接收一串,空闲了认为报文结束,进去关DMA,再打开(这个过程能清计数)。这个的优点就是DMA自己动,一串报文就DMA中断和空闲中断两个。实时性基本不影响。问题是DMA的搬运速度是大数据量的比CPU快,小数据的可能比CPU慢的多。像是modbus rtu 一条报文最多256字节,而且一般情况都是01,03,00,00,00,64,xx,xx这种长度,处理速度会慢。

        综上:对于严格遵循报文时间规定的通讯协议,应该只能用1a了,对于数据量小,而且功能单一的1都可以,任务量多一点的就用1b。对于数据量大或者实时性要求高,用2。当然要求不严格用哪个都行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值