打印
[信息]

【实战经验】UART的断帧检测

[复制链接]
2459|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 用于输出空闲帧信号, 每次检测到空闲帧时信号点平翻转。

示波器波形图:

建议:
本例程的缺陷:如果帧中最后的一个数据为 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 帧做帧起始高效.

使用特权

评论回复
5
可可球| | 2015-8-9 11:52 | 只看该作者
检测到空闲帧后,接收方认为该帧结束,停止 DMA 接收数据。
这个很有用

使用特权

评论回复
6
风云龙| | 2017-7-23 23:06 | 只看该作者
airwill 发表于 2015-8-6 22:30
嗯, 是个不错的断帧检测方法. 所提缺陷对应用影响不大.
不过, 我感觉这方法消耗的硬件资源有点多, 不如 LIN ...

你好,版主,请问 break 帧怎么发啊?我用STM32始终都发不出 break 帧,请赐教,谢谢

使用特权

评论回复
7
airwill| | 2017-7-24 08:15 | 只看该作者
STM32 的 USART 都支持 LIN 功能. 你要使能 LIN 功能吧, 记得有 发 Break 的库驱动函数吧. 也就是设置个寄存器位罢了

使用特权

评论回复
8
七颗咖啡豆| | 2017-7-28 22:53 | 只看该作者
本帖最后由 七颗咖啡豆 于 2017-7-28 22:54 编辑

modbus-RTU  
随便利用个定时器做一下超时断帧即可
可以不拘泥于任何MCU

使用特权

评论回复
9
alex_li0824| | 2017-7-29 06:29 | 只看该作者
这个是个哈方法,不错

使用特权

评论回复
10
dw772| | 2020-2-12 15:30 | 只看该作者
airwill 发表于 2015-8-6 22:30
嗯, 是个不错的断帧检测方法. 所提缺陷对应用影响不大.
不过, 我感觉这方法消耗的硬件资源有点多, 不如 LIN ...

请问一下如何连续发送2个break信号?就是发送一个break后不出现高电平后又连续发送一个break低电平?

使用特权

评论回复
11
airwill| | 2020-2-12 22:26 | 只看该作者
dw772 发表于 2020-2-12 15:30
请问一下如何连续发送2个break信号?就是发送一个break后不出现高电平后又连续发送一个break低电平? ...

为何要连续2个 break 呢?

使用特权

评论回复
12
dw772| | 2020-2-15 16:01 | 只看该作者
airwill 发表于 2020-2-12 22:26
为何要连续2个 break 呢?

因为通讯需要break的时间长度比11bit的时间长,所以只能发送2个或多个break,并且两个break之间不能有高电平出现。

使用特权

评论回复
13
airwill| | 2020-2-16 07:26 | 只看该作者
dw772 发表于 2020-2-15 16:01
因为通讯需要break的时间长度比11bit的时间长,所以只能发送2个或多个break,并且两个break之间不能有高 ...

你可以考虑换波特率

使用特权

评论回复
14
god9987| | 2020-2-16 10:15 | 只看该作者
多谢提供的资料!
我在使用的时候,仍然用的还是最简单的那种起始帧、长度、功能帧之类的传统的方式。。。

使用特权

评论回复
15
jackghl| | 2020-2-17 14:27 | 只看该作者
这个功能和 中断UART_IT_IDLE  有什么不一样吗?

使用特权

评论回复
16
dw772| | 2020-4-18 23:21 | 只看该作者
jackghl 发表于 2020-2-17 14:27
这个功能和 中断UART_IT_IDLE  有什么不一样吗?

UART_IT_IDLE这个是接收中断,发送2个break是用是发送

使用特权

评论回复
17
shcnxjy| | 2020-4-19 09:57 | 只看该作者
学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

596

主题

17084

帖子

284

粉丝