单片机串口中断发送数据,偶发无包头发送

文章讨论了在使用华大单片机HC32F4A0开发项目中,串口发送数据时遇到的包头丢失问题,主要原因是发送缓存中断与新数据包同时触发导致包头未发送完整。解决方法是移除发送缓存中断,确保每个数据包完全发送后再读取下一个。
摘要由CSDN通过智能技术生成

问题描述:

1、在本次项目开发过程中,发现串口发送数据时,偶尔有一包数据的包头会发送失败,通过串口读取数据发现发送出来的数据没有包头。出现这个情况时,都是一下要发送多个数据包,由于包头,在解包是会将对应的数据包直接丢掉,导致的最终现象为传送数据时有部分数据未收到。

图片:

运行环境:华大单片机HC32F4A0

基本知识介绍:

串口发送数据的基本原理:

(1)发送的简单流程:

         ①将要发送的数据放在数据寄存器→②数据寄存器的数据转移到移位寄存器中→③串口硬件将数据发送出去(每次发送1个bit)

(2)发送中断介绍:

         发送缓存空中断:数据从数据寄存器转移到移位寄存器后产生的中断为发送缓存空中断(使能发送缓存空中断的情况下才能产生);

         发送完成中断:移位寄存器中的最后1bit数据发送完成后产生的中断为发送完成中断(是能发送完成中断的情况下才能产生);

修改前数据发送的的操作:

1、将要发送的数据通过打包协议对数据打包,打包后的数据格式为0xAA XX XX XX XX 0x55,其中0xAA为包头,0x55为包尾,将打包好的数据放入到队列中list,使能串口发送和发送缓存空中断;

2、发送缓存空中断的回调函数中的处理为:从队列list中取数据放入到数据寄存器中(队列中的数去一个则少一个);检查队列中的数据是否为空(数据取完),若取完则关闭缓存空中断,使能发送完成中断;

3、发送完成中断的回调处理函数为:关闭串口发送和发送完成中断使能;

正常的发送过程为:

P1t0:要发送的数据经过打包后,放入队列中,打开串口和发送缓存空中断;

P1t1-P1t5:通过发送缓存空中断取出队列中的数据放入到数据寄存器中(之后通过硬件自动将数据转移到移位寄存器中,然后发送);

P1t5:直到取到最后一个数据后(队列为空),关闭发送缓存空中断,打开发送完成中断;

P1t6:等到发送完成后产生发送完成中断,然后关闭串口发送和发送完成中断。

异常分析:

当要发送多个数据包时:是逐个将每个数据包打包,然后放入到队列中,然后打开串口发送和发送缓存空中断,这个过程中出现的问题为:

P1t5:当把队列的最后一个数据读取出来放入到发送数据寄存器后(队列为空),会关闭发送缓存空中断,打开发送成功中断;

P1t6:在等待发送完成中断过程中,P2t0下一包数据打包好了,放入队列中,然后又打开了串口发送和发送缓存空中断,这个时候P2t1就会立马产生缓存空中断读取下一包的包头到数据寄存器中,等到第一包的包尾发送完成后,产生完成中断,关闭了串口发送和发送成功中断。由此导致下一包(P2)的包头从队列中读取出来了,未发送成功;

再产生第3包时会把第2包剩余数据发送出来,导致第二包没有包头。

简单来说就是在发送第一包最后一个数据时,来了第二包数据,导致此时,串口发送、串口缓存空中断、串口完成中断都被打开,第二包数据的包头会被自动读取到发送寄存器中,等到第一包最后一个数据发送完成后,产生发送完成中断,关闭了串口发送、发送完成中断,第二包数据包头虽然进入了发送寄存器,但未发送,在发送地三报数据时,会连同第二包剩下数据一起发送出来,导致第二包没有包头。

解决方案:

去掉发送缓存中断,在发送完成中断响应中,从队列中读取数据,以此保证每一个数据都是被成功发送后,才会再读取下一个数据。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值