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

查看: 5392|回复: 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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版