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

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

[复制链接]
netlhx 提问时间:2015-11-15 21:39 /
本帖最后由 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, 下载次数: 316)

评分

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

查看全部评分

收藏 5 评论15 发布时间:2015-11-15 21:39

举报

15个回答
风子 回答时间:2015-11-15 22:03:59
顶楼主,研究得深入
Paderboy 回答时间:2015-11-15 22:32:56
多谢分享。。
netlhx 回答时间:2015-11-15 22:39:24
风子 发表于 2015-11-15 22:03
顶楼主,研究得深入

基础的东西
netlhx 回答时间:2015-11-15 22:39:36

多谢分享
风子 回答时间:2015-11-15 22:44:40

我也干过在某个时候把couter改为1,怎么没想到用来做不定长呢
lkl0305 回答时间:2015-11-15 22:44:54
多谢分享,那个软件不错
wu1169668869 回答时间:2015-11-16 08:45:51
hal的调用看着挺累人 3.gif
hpdell 回答时间:2015-12-1 15:50:05
你好,请教下,如果有些数据也是 0x0d,那该如何处理啊 ???
peter001 回答时间:2015-12-1 18:11:29
多谢分享
beary 回答时间:2015-12-2 09:43:06
多谢分享       请问楼主会用流控吗?
xinyu1650 回答时间:2018-5-9 11:59:29
多谢分享。。
weilanhai56d40d 回答时间:2018-7-19 17:02:24
感谢分享
ccav2010 回答时间:2018-8-15 15:50:05
多谢分享~
哈哈哈11223 回答时间:2018-10-19 12:29:12
谢谢大佬
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版