OpenEdv-开源电子网

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

HAL_UART_Receive_IT() 的参数size只能为1吗?

[复制链接]

5

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2017-4-27
在线时间
58 小时
发表于 2021-9-27 22:11:48 | 显示全部楼层 |阅读模式
​HAL库不能自动存定长的数据到数组中吗? HAL_UART_Receive_IT()的参数size如果不能修改,那么只有1能用有什么意思。

https://blog.csdn.net/qq_33559992/article/details/76218291 ::该地址说明了UART_Receive_IT()中包括以下内容:
*huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
    if (--huart->RxXferCount == 0U)
可以看出地址是增加了。

https://zhuanlan.zhihu.com/p/401368370 ::该地址说明如下:
指针的运算
指针加上一个整数n 指针加上一个整数n相当于指针加上了一个 n*sizeof(类型名) 递增指针 p++ 、++p 加上了一个 sizeof(类型名)
指针减去一个整数n 指针减去一个整数n相当于指针减去了一个 n*sizeof(类型名) 递减指针 p-- 、--p 减去了一个 sizeof(类型名)
也就是说只要让类型名变成希望的数组元素长度,就可以实现自动存放。关键是:UART_RECEIVE_IT 在最后会关闭中断。

如何破解?只要允许接收中断,其他参数不改变是不是就可以了吗?
那会不会影响一开始的HAL_UART_Receive_IT参数设置?

​
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2020-6-24
在线时间
241 小时
发表于 2021-9-28 09:42:50 | 显示全部楼层
不为1也行,看你接收缓存的大小,如果你设置为10的话,就是要等到接受了10个数据之后才会中断,每次中断记得重新设置HAL_UART_Receive_IT,设置为1有个很烦的bug就是数据量大了,必定丢数据
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13114
金钱
13114
注册时间
2012-11-26
在线时间
3812 小时
发表于 2021-9-28 09:53:40 | 显示全部楼层
qq1198228505 发表于 2021-9-28 09:42
不为1也行,看你接收缓存的大小,如果你设置为10的话,就是要等到接受了10个数据之后才会中断,每次中断记 ...

HAL的中断用标准库框架写

不要用HAL库的框架,HAL库一直在禁止中断开启中断,不丢数据才有鬼
学无止境
回复 支持 反对

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-9-28 10:21:11 | 显示全部楼层
本帖最后由 wklhwkl 于 2021-9-28 10:25 编辑

分享一个超时接收   不会丢数据

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
        if (UartHandle == &huart3)
        {
                uart0_buf[recieve_index++] = aRxBuffer;
                // 这里需要判断recieve_index是否越界
                recievedFlag = 1;
                uartTimeCounter = 1+HAL_GetTick();
                HAL_UART_Receive_IT(&huart3,&aRxBuffer,1);
        }
}

int main{
...

HAL_UART_Receive_IT(&huart3,&aRxBuffer,1);
while(1)
{
          if(recievedFlag && uartTimeCounter <HAL_GetTick())
         {
               recievedFlag=0;
               //处理数据

         }

}
}

回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2017-4-27
在线时间
58 小时
 楼主| 发表于 2021-9-28 20:04:10 | 显示全部楼层
本帖最后由 sjh2101 于 2021-9-28 21:13 编辑

感谢楼上的三位兄弟!等我试试再来汇报!
qq1198228505:就是要等到接受了10个数据之后才会中断,每次中断记得重新设置HAL_UART_Receive_IT,设置为1有个很烦的bug就是数据量大了,必定丢数据
------这样是应该有用的。
jermy_z:HAL库一直在禁止中断开启中断,不丢数据才有鬼
------原来如此,这是HAL库自己折腾自己呢。
wklhwkl:HAL_UART_Receive_IT

------这个要求比较高,动手修改库函数了。
感谢三位的指点,我修改了size,回调函数中再次使能。回调函数中设置断点后,均能看到发送的数据。
故此我在回调函数中设置标志,主程序中设置标志并处理。

回复 支持 反对

使用道具 举报

7

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2020-6-24
在线时间
241 小时
发表于 2021-9-29 10:03:18 | 显示全部楼层
jermy_z 发表于 2021-9-28 09:53
HAL的中断用标准库框架写

不要用HAL库的框架,HAL库一直在禁止中断开启中断,不丢数据才有鬼

感谢指正
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 22:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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