硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2748|回复: 5
收起左侧

STM32V6之串口HAL库接收不定长字节数据方法三 心跳相对超时判断

[复制链接]

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2020-11-21 12:14:19 | 显示全部楼层 |阅读模式
07_STM32V6_UART_RX_TIMEOUT_Tick.rar (5.57 MB, 下载次数: 55)

空闲中断的超时是由硬件完成的超时判断,时间为一个数据的传输时间(和波特率校验位和停止位相关)。
心跳相对超时判断原理和IDLE空闲方式差不多,只不过一个是硬件完成,一个由软件完成,
相对来说,软件的这种方式灵活一点,或者说也避免了有些设备串口发送数据的不连续性
(估计是那种带RTOS,然后发送不用IT或者DMA等大致2个数据间隔时间超出空闲时间了)。
心跳方式使用systick里面的心跳计数,和单数据接收一样,如果有数据接收到了将心跳当前值记录下来rxTick,
如果没有新的数据接收到,在任务里面对心跳值比较,方式类似带操作系统的方式
#defineUART1_RX_TIMEOUT    10
if((osKernelGetTickCount()- g_tBspUart.rxTick) >= UART1_RX_TIMEOUT)
1.jpg

osKernelGetTickCount使用了RTX5的心跳获取API接口,方便以后使用RTX5时移植。

2.jpg

接收处理和IDLE空闲还是很类似的,只不过需要程序员自己去查询接收寄存器里面的值是否变化了,
如果变化了开启超时判断超时以后的处理和IDLE是一样的。
3.jpg

对于超时处理,有012三种情况,具体看图
4.jpg
5.jpg

评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2020-11-22 09:54:46 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2020-11-29 10:24:47 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

8

主题

104

回帖

138

积分

初级会员

积分
138
发表于 2020-12-8 16:37:21 | 显示全部楼层
我之前也是这样做的,但是数据量大的情况下会出现 粘包现象,需要解  粘包,电脑的串口调试助手,只能最小间隔 2~3ms,实际上,如果从机发包,间隔基本上 几十个us,所以这个方法不是很好,最后老老实实用FIFO缓冲了(为了可移植性好,没用IDLE+DMA)
回复

使用道具 举报

74

主题

1202

回帖

1424

积分

至尊会员

积分
1424
发表于 2020-12-8 18:11:55 | 显示全部楼层
由崎星空 发表于 2020-12-8 16:37
我之前也是这样做的,但是数据量大的情况下会出现 粘包现象,需要解  粘包,电脑的串口调试助手,只能最小 ...

同意你的观点,idle其实不见得好
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
 楼主| 发表于 2020-12-8 21:02:52 | 显示全部楼层
由崎星空 发表于 2020-12-8 16:37
我之前也是这样做的,但是数据量大的情况下会出现 粘包现象,需要解  粘包,电脑的串口调试助手,只能最小 ...

IDEL DMA是针对于主从的一种接收方式,你说间隔几十个US,你这不是主从了。IDLE+DMA只是提供了一种思路,FIFO或者队列的方式还有按照协议来解析的没时间来整。实际应用只是最优解,FIFO只能说通吃所有情况,但不是最高效的。编程就是选择合适的方式,而不是说哪种好哪种不好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 09:23 , Processed in 0.187386 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表