1、中断接收函数打印接收字节数2、读取部分打印接收字节数
3、打印结果
查看更多
DMA空闲中断的空闲时间很短且不可调,所以依赖DMA空闲中断来分帧,可靠性差。
msgt不能用局部变量
1、DMA默认开启了传输完成、半传输、传输错误、直接模式错误中断,全部关掉
2、修改回调函数
3、测试结果,暂时正常
@winfeng
看了上述讨论受益匪浅
学习到了。受益匪浅
uart只是保证一个frame是连续,你可以理解为一个字节的位是连续的,从来不保证frame与frame之间是连续的,很多MCU的uart外设甚至有frame delay功能,靠空闲中断断帧是很不靠谱的,uart只是一个流式协议,你理解的帧这个概念在uart里不存在,uart里的帧不是你理解的帧,所以所谓的断帧一定是上层的事情,包括上面很多人说rtu这种,这本身也都是上层协议的约定。
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
对的!帧处理是应用层的事!不要试图依赖驱动特性来做应用层的活。程序设计中应尽量避免这样的做法。
1、并不是依靠中断来分帧,而是DMA中断有时会把完整的一帧给分开。
2、串口DMA接收模式下,开启了DMA的中断,又开启了串口空闲中断。这样DMA中断调回调函数,串口空闲中断又调回调函数,显然没必要。那直接关掉DMA中断,只用串口空闲中断,这样读取时更接近完整的一帧。
3、当只使用串口空闲中断时,应用层处理的报文更接近一帧(不会被DMA中断截断),这样丢弃的字节数更少
4、drv_uart.c中可以关闭DMA的中断,不用修改hal库
@出出啊
@红枫
说这句话的时候,你就已经认为不应该出现不该有的中断打断你的数据接收。
第三条,你又使用空闲中断来分帧
你这种需求,不适合使用串口驱动,用裸机方式实现更好。
@yc961213911
@出出啊
靠中断分帧确实不可取!
昨天调了个设备,PC端串口监控看似完整的一帧,被空闲中断分成了好几帧。所以,应用层需要拼报文并校验。
对于不定长数据,采用什么方法更合适分开一帧呢@yc961213911
可以使用rs485软件包,它可以通过配置合适的字节超时,实现可靠分帧,适合问答试协议和多协议并行处理
@yc961213911 这里取决于PC端对串口数据包的封包发送了。过长的数据是会被他截取成多段发送出去,所以在设备的接收端会变现为触发了多次的IDLE中断。如果不是PC端发送数据,而是由另外一块主板通过DMA TX就只会产生一次IDLE中断了。@yc961213911
modbus rtu中是通过3.5T的一个定时器来判断完整整帧的,即连续3.5个字符的时间没有收到字符则认为是一个完整的帧响应。@Assert