OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8618|回复: 11

关于stm32的HAL库接收不定长数据问题!

[复制链接]

12

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2017-8-1
在线时间
92 小时
发表于 2019-2-26 09:39:34 | 显示全部楼层 |阅读模式
5金钱
最近一直在用HAL库,发现HAL库开发UART真难用,尤其是接收,只能接收固定长度的数据流,而对于不定长数据的接收却很乏力!后来研究了下原子的例程,表面上看是能接收不定长了,但是依赖于帧尾为0x0D  0x0A这种带回车换行的结尾才行。想问一下万能的坛友,有没有更好的方法,能使用HAL库按字节接收数据,解决不定长数据的接收问题。

最佳答案

查看完整内容[请看2#楼]

1. 改自己的代码, 每次只收1个byte. 可以搭配数组储存接受到的资料, 直到某种条件发生时(如帧尾为0x0D 0x0A)再进行处理. 2. 绕过全部或部分HAL代码, 自己存取寄存器, 做出符合自己需求的动作.
青涩不及当初,聚散不由你我!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2019-2-26 09:39:35 | 显示全部楼层
1. 改自己的代码, 每次只收1个byte. 可以搭配数组储存接受到的资料, 直到某种条件发生时(如帧尾为0x0D  0x0A)再进行处理.
2. 绕过全部或部分HAL代码, 自己存取寄存器, 做出符合自己需求的动作.
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-2-26 09:49:16 | 显示全部楼层
IDLE, 它是利用接收数据与接收数据之间的停顿时间所产生事件, 可以产生中断
回复

使用道具 举报

12

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2017-8-1
在线时间
92 小时
 楼主| 发表于 2019-2-26 10:29:15 | 显示全部楼层
edmund1234 发表于 2019-2-26 09:49
IDLE, 它是利用接收数据与接收数据之间的停顿时间所产生事件, 可以产生中断

啥意思?
青涩不及当初,聚散不由你我!
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2019-2-26 13:15:28 | 显示全部楼层
串口空闲中断,中断产生说明已经接收完一个完整的数据流
回复

使用道具 举报

12

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2017-8-1
在线时间
92 小时
 楼主| 发表于 2019-2-26 20:58:51 | 显示全部楼层
lvkanger 发表于 2019-2-26 13:15
串口空闲中断,中断产生说明已经接收完一个完整的数据流

这个方法不靠谱啊。如果1包数据很大,大到UART的数据寄存器溢出,等产生空闲中断时数据依然会丢!
青涩不及当初,聚散不由你我!
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2019-2-27 09:24:11 | 显示全部楼层
风清扬丶 发表于 2019-2-26 20:58
这个方法不靠谱啊。如果1包数据很大,大到UART的数据寄存器溢出,等产生空闲中断时数据依然会丢!

UART数据寄存器只能接收1个字节啊,要自己开辟一个缓冲区啊,缓冲区当然得根据你实际情况来开了,保证同时接收几包最大包不丢。一直这么用,还没出过问题。
回复

使用道具 举报

3

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
434
金钱
434
注册时间
2013-3-18
在线时间
82 小时
发表于 2019-2-28 16:50:53 | 显示全部楼层
F1的话用DMA+空闲中断的比较多;
F0的话有超时中断,这个非常好使;
接收不定长的数据,判断接收数据流时什么时候结束,这个是关键,一般用超时(可用定时器来做)判断。例如Modbus协议超时时间是3.5个bit单位时间。所以说这个时间是根据协议来定的。
接收缓冲区的大小是有限的,如果数据流一直传输,超过这个长度的数据,就要做相应处理了(超过范围的数据要么是缓冲大小设计不合理,要么是别人乱发的)。
回复

使用道具 举报

12

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2017-8-1
在线时间
92 小时
 楼主| 发表于 2019-3-1 21:43:12 | 显示全部楼层
sammy902583 发表于 2019-2-26 22:27
1. 改自己的代码, 每次只收1个byte. 可以搭配数组储存接受到的资料, 直到某种条件发生时(如帧尾为0x0D  0x0 ...

哥,你说的确实很有道理,你QQ多少啊?加一下你
青涩不及当初,聚散不由你我!
回复

使用道具 举报

12

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2017-8-1
在线时间
92 小时
 楼主| 发表于 2019-3-2 19:32:06 | 显示全部楼层
问题已解决,原来在使用UART的HAL库回调函数接收时,在接收期间不能动正在接收的数据,得等到接收完成之后,要么根据接收数据的帧尾判断结束或者根据超时判断结束后,才能再去处理接收完的数据。哈哈,现在感觉UART的HAL库接收还是很好用的嘛!很省事!
青涩不及当初,聚散不由你我!
回复

使用道具 举报

31

主题

158

帖子

0

精华

高级会员

Rank: 4

积分
738
金钱
738
注册时间
2020-4-30
在线时间
111 小时
发表于 2020-6-30 14:17:59 | 显示全部楼层
如果帧结束的字节也是不固定的  这种情况怎么解决呢  您的这种判断帧结束字节的方法有一定的局限性啊
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2021-8-11
在线时间
3 小时
发表于 2021-8-27 16:49:12 | 显示全部楼层
楼主能不能分享一下源代码,最近也在学习hal库,对串口接收部分很头疼
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-30 13:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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