[信息] 【实战经验】UART的断帧检测

[复制链接]
3315|16
 楼主| 香水城 发表于 2015-8-4 09:30 | 显示全部楼层 |阅读模式
UART, AC, TI, ST, STM
本帖最后由 香水城 于 2017-8-17 14:21 编辑

UART的断帧检测

问题:
在某些串行工业总线协议中,如 Profibus,每帧发送的数据长度不定,导致接收方在接收数据时无法 确定帧的结束点。

调研:
STM32 系列产品的定时器具有 slave reset 模式。利用该功能可以捕获总线上的设定长度的空闲位。

结论:
本例程在 STM3220G-EVAL 上实现了 USART 空闲帧的检测,空闲帧的长度可配置。在 Profibus 协议中, 空闲帧长度为 33 位。检测到空闲帧后,接收方认为该帧结束,停止 DMA 接收数据。

处理:
该例程可在 STM3220G-EVAL 上运行。使用 USART6 的 DMA 方式收发数据,使用 TIM9 的 Slave Reset 模式: TIM9_CH1 用于捕获串口的接收数据波形,并在下降沿将 TIM9 的计数器清零; TIM9_CH2 用于输出比较,监测是否收到连续 33 位的高电平,即空闲帧;PG8 用于输出空闲帧信号, 每次检测到空闲帧时信号点平翻转。
1.PNG
示波器波形图:
2.PNG
建议:
本例程的缺陷:如果帧中最后的一个数据为 0xFF 时,将会被做为空闲帧的一部分处理。但是在 Profibus 协议中,最后一个数据可自行定义。
在本例程的基础上,也可实现 SPI 等其它串行协议的断帧处理。


对应的PDF:UART的断帧检测
更多实战经验请看:【ST MCU实战经验汇总贴】

colin2135 发表于 2015-8-6 16:43 | 显示全部楼层
谢谢,非常有用,怎么没人回复呢。
venus5712 发表于 2015-8-6 17:28 | 显示全部楼层
谢谢!
airwill 发表于 2015-8-6 22:30 | 显示全部楼层
嗯, 是个不错的断帧检测方法. 所提缺陷对应用影响不大.
不过, 我感觉这方法消耗的硬件资源有点多, 不如 LIN 的 break 帧做帧起始高效.
可可球 发表于 2015-8-9 11:52 | 显示全部楼层
检测到空闲帧后,接收方认为该帧结束,停止 DMA 接收数据。
这个很有用
风云龙 发表于 2017-7-23 23:06 | 显示全部楼层
airwill 发表于 2015-8-6 22:30
嗯, 是个不错的断帧检测方法. 所提缺陷对应用影响不大.
不过, 我感觉这方法消耗的硬件资源有点多, 不如 LIN ...

你好,版主,请问 break 帧怎么发啊?我用STM32始终都发不出 break 帧,请赐教,谢谢
airwill 发表于 2017-7-24 08:15 | 显示全部楼层
STM32 的 USART 都支持 LIN 功能. 你要使能 LIN 功能吧, 记得有 发 Break 的库驱动函数吧. 也就是设置个寄存器位罢了
七颗咖啡豆 发表于 2017-7-28 22:53 | 显示全部楼层
本帖最后由 七颗咖啡豆 于 2017-7-28 22:54 编辑

modbus-RTU  
随便利用个定时器做一下超时断帧即可
可以不拘泥于任何MCU
alex_li0824 发表于 2017-7-29 06:29 | 显示全部楼层
这个是个哈方法,不错
dw772 发表于 2020-2-12 15:30 | 显示全部楼层
airwill 发表于 2015-8-6 22:30
嗯, 是个不错的断帧检测方法. 所提缺陷对应用影响不大.
不过, 我感觉这方法消耗的硬件资源有点多, 不如 LIN ...

请问一下如何连续发送2个break信号?就是发送一个break后不出现高电平后又连续发送一个break低电平?
airwill 发表于 2020-2-12 22:26 | 显示全部楼层
dw772 发表于 2020-2-12 15:30
请问一下如何连续发送2个break信号?就是发送一个break后不出现高电平后又连续发送一个break低电平? ...

为何要连续2个 break 呢?
dw772 发表于 2020-2-15 16:01 | 显示全部楼层
airwill 发表于 2020-2-12 22:26
为何要连续2个 break 呢?

因为通讯需要break的时间长度比11bit的时间长,所以只能发送2个或多个break,并且两个break之间不能有高电平出现。
airwill 发表于 2020-2-16 07:26 | 显示全部楼层
dw772 发表于 2020-2-15 16:01
因为通讯需要break的时间长度比11bit的时间长,所以只能发送2个或多个break,并且两个break之间不能有高 ...

你可以考虑换波特率
god9987 发表于 2020-2-16 10:15 | 显示全部楼层
多谢提供的资料!
我在使用的时候,仍然用的还是最简单的那种起始帧、长度、功能帧之类的传统的方式。。。
jackghl 发表于 2020-2-17 14:27 | 显示全部楼层
这个功能和 中断UART_IT_IDLE  有什么不一样吗?
dw772 发表于 2020-4-18 23:21 | 显示全部楼层
jackghl 发表于 2020-2-17 14:27
这个功能和 中断UART_IT_IDLE  有什么不一样吗?

UART_IT_IDLE这个是接收中断,发送2个break是用是发送
shcnxjy 发表于 2020-4-19 09:57 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17195

帖子

291

粉丝
快速回复 在线客服 返回列表 返回顶部