你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 5399|回复: 15

[STM32L476] 【NUCLEO-L476RG开发】UART接收不定长数据

[复制链接]

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
发表于 2015-11-15 21:39:29 | 显示全部楼层 |阅读模式
本帖最后由 netlhx 于 2015-11-15 21:53 编辑

UART在所有的STM32中应该都是标配外设了吧。所以这个讨论应该是适用所有STM32开发板或产品的。

自己设想的东西,未必适合。当然杀猪杀屁股,各有各的杀法,欢迎大家一起讨论.

在HAL出现之前,对UART编程一般来说都是这样子一个步骤:配置UART外设参数及引脚,然后发送或接收数据,或是单个收发,或是通过DMA来收发。不管使用哪种方式,都离不开对状态寄存器的查询来采取相应的处理。不过HAL库函数封装得更加厉害,简化成配置好UART外设后,直接发送或接收就行了,当然在收发完成后,提供了相应的中断函数供用户调用以便处理相应的数据。

过程简化了,但是仔细看函数参数,发现不管是接收还是发送,都是定长的。这样子对于发送来说,问题不大,但接收的话呢,如果碰到不定长的输入数据,就要另行处理了。

QQ截图20151115165632.png

QQ截图20151115165650.png

以中断接收和发送为例,函数中都有一个指定的长度,也就是说,我们只能实现定长的发送和接收。

进一步跟踪代码发现,如果接收或发送的值没有达到,HAL_UART_RxCpltCallback(huart)函数就不会被调用,而这个函数是提供给用户的中断钩子函数,我们没有办法来处理实际已完成的数据的处理,这个是个大问题!

有代码为证

QQ截图20151115170454.png


不过进一步跟踪代码,发现其实中断还是启用了的。在每个接收和发送完成后,都会调用相应的中断处理器,但是不到数据完成,不会调用钩子函数。

所以要实现不定长数据的接收,要么改变HAL库的原代码,要么自己单独监视接收到的每一个字符。这里提供一种效率不是很高的处理方法,使用中断模式来接收单个字符,然后人为设定一个输入结束标志,用回车来做为结束标志是一个比较好的选择。

通过仔细研究HAL处理中断的原理,通过添加一个简单的回调函数,就可以实现该功能,步骤记录如下:

1. 声明回调函数原型

QQ截图20151115211508.png
2. 添加回调函数,以weak方式实现,便于用户添加代码

QQ截图20151115211537.png

3. 添加用户处理代码

QQ截图20151115211727.png

4. 在接收回调完成函数中将收到的数据再发回去,验证正确性。

QQ截图20151115211908.png

这里的东西,说白了,就是加入自己的处理机制,一旦检测到回车或换行,这里检测的是0X0D,即回车符,就强制将接收过程结束。以回调的方式来实现用户检测功能,既不破坏原有的HAL功能,又实现了不定长检测。

当然在具体的应用中,可以设计自己的UART通信协议,实现定长数据FRAME的发送和接收,这样就和HAL非常吻合。但这里只是一个尝试!

为测试效果做的一个“复读机”,如下

QQ截图20151115212602.png

上面是输入的字符,下面是原样输出的内容。很没有意思的东西,就是一个复读机

其实还有一种方法,利用超时来控制不定长数据接收的计算,只不过需要知道在指定的参数情况下,发送一个字符大致需要多长的时间,然后再通过计算来得到超时的情况。只不过这样做的话,有点舍本逐末了。下面用LA抓的一张图,看看一个字符要多少时间。

参数

QQ截图20151115213143.png


一个字符发送的时间

QQ截图20151115213119.png

工程文件:


uart.zip (3.17 MB, 下载次数: 307)

评分

参与人数 1ST金币 +15 收起 理由
沐紫 + 15

查看全部评分

<
回复

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-11-15 22:03:59 | 显示全部楼层
顶楼主,研究得深入
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2015-11-15 22:32:56 | 显示全部楼层
多谢分享。。
回复 支持 反对

使用道具 举报

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
 楼主| 发表于 2015-11-15 22:39:24 | 显示全部楼层
风子 发表于 2015-11-15 22:03
顶楼主,研究得深入

基础的东西
回复 支持 反对

使用道具 举报

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
 楼主| 发表于 2015-11-15 22:39:36 | 显示全部楼层

多谢分享
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-11-15 22:44:40 | 显示全部楼层

我也干过在某个时候把couter改为1,怎么没想到用来做不定长呢
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-11-15 22:44:54 | 显示全部楼层
多谢分享,那个软件不错
回复 支持 反对

使用道具 举报

14

主题

1066

回帖

2

蝴蝶豆

金牌会员

最后登录
2019-1-10
发表于 2015-11-16 08:45:51 | 显示全部楼层
hal的调用看着挺累人 3.gif
回复 支持 反对

使用道具 举报

227

主题

601

回帖

32

蝴蝶豆

金牌会员

最后登录
2020-11-10
发表于 2015-12-1 15:50:05 | 显示全部楼层
你好,请教下,如果有些数据也是 0x0d,那该如何处理啊 ???
回复 支持 反对

使用道具 举报

11

主题

1139

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-10
发表于 2015-12-1 18:11:29 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版