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

再次质疑 HAL_UART_Receive_IT函数  

[复制链接]
与龙共舞 提问时间:2018-4-19 17:38 /
阅读主题, 点击返回1楼
收藏 1 评论36 发布时间:2018-4-19 17:38
36个回答
jjbboox 回答时间:2018-4-23 09:39:43
放在轮询里面又有何不可呢?
反正当上次接收还没有结束的时候调了也没用,但是当上次接收结束了,调一下又进入接收状态了呀,本来HAL库就是这么设计的。
非要在中断回调中再开启中断接收,似乎没有必要。而且万一这个时候由于其他原因串口接收被占了,你调用中断接收失败,整个链条就断了。还是放在while(1)中保险。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

uglyclown 回答时间:2018-7-7 15:51:43
zhao.zhao 发表于 2018-4-20 16:44
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);//6
这个函数是每次串口1接收到了设置的10个字节 ...

那为什么把10改成1就好了
ringsp 回答时间:2018-8-12 10:20:32
没见过STM32这么蛋疼的串口,非标准16C550,纯自定义的。大多数情况下的应用都是,需要每一字节去解析协议。初始化的时候开启接收中断,只要来数据,要么满硬件FIFO触发中断,要么就是来了数据但不满FIFO触发超时中断,两种中断都可以去处理数据。而ST的HAL自以为是要么死等timeout,而把中断方式做成不断的开关中断,把很好的回调概念玩残了。而且没有硬件FIFO,容易丢字节。真不知道用STM32垃圾芯片的都是些什么应用,为了那些连环形队列数据结构都不会的人快速上手做产品?
zhao.zhao 回答时间:2018-8-12 10:41:30
uglyclown 发表于 2018-7-7 15:51
那为什么把10改成1就好了

传统串口应该是接收1个字节,中断一次,如果你的程序是这样设计的,就把10改成1就可以了。
其实本质上这个串口也是接收1个字节,中断一次的,只不过接收的字符没有达到用户设定的数量时,它没有进入接收中断回调函数。
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);
用上面这个函数设置也就在接收定长帧数据时比较方便。不定长的帧数据为了避免遗漏数据,确实要把10改成1的。
ringsp 回答时间:2018-8-12 11:59:57
zhao.zhao 发表于 2018-8-12 10:41
传统串口应该是接收1个字节,中断一次,如果你的程序是这样设计的,就把10改成1就可以了。
其实本质上这 ...

改成1之后,如果在接收回调函数里面做数据解析并给线程发送消息,那么很可能紧接着的第二个字节overflow,因为串口只有1个字节的硬件FIFO,非常奇怪st的库用的那么广,难道大家都没遇到问题吗?
zhao.zhao 回答时间:2018-8-12 13:58:21
一般不会溢出,串口中断优先等级设置得高一点,串口相对于CPU的运行速度慢多了,一般接收一个字节的时间够串口中断程序运行完成。
cczhw 回答时间:2018-8-21 08:53:47
ringsp 发表于 2018-8-12 11:59
改成1之后,如果在接收回调函数里面做数据解析并给线程发送消息,那么很可能紧接着的第二个字节overflow ...

那是你没做好。
ringsp 回答时间:2018-9-8 07:10:01
本帖最后由 ringsp 于 2018-9-8 07:12 编辑
cczhw 发表于 2018-8-21 08:53
那是你没做好。

一大帮干单片机的,看到st的驱动库惊为高科技。用过环形队列做串口收发吗?真正理解钩子函数吗?用过链表数据结构吗?用过动态内存分配吗?对编译器和arm架构理解吗?有没有用散转文件去定义程序段和数据段的位置?用cube生成一个上百M的工程上来就可以写print hello world就是高手了?
Snail_Feng 回答时间:2018-9-8 09:02:43
ringsp 发表于 2018-9-8 07:10
一大帮干单片机的,看到st的驱动库惊为高科技。用过环形队列做串口收发吗?真正理解钩子函数吗?用过链表 ...

DMA了解一下
hellolinux-2302 回答时间:2018-9-8 09:16:32
看来那HAL火就不打一处冒出来,简单的事情弄得这么复杂......................直接勾选LL库!!
void MX_USART1_UART_Init(void) 函数中最后增加
  1. LL_USART_EnableIT_RXNE(USART1);
复制代码
发送用printf函数
  1. #include "stdio.h"
  2.   #ifdef __GNUC__
  3.     /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  4.        set to 'Yes') calls __io_putchar() */
  5.     #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  6.   #else
  7.     #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  8.   #endif /* __GNUC__ */

  9. /*******************************************************************************
  10. * Function Name  : PUTCHAR_PROTOTYPE
  11. * Description    : Retargets the C library printf function to the USART.
  12. * Input          : None
  13. * Output         : None
  14. * Return         : None
  15. *******************************************************************************/
  16.         PUTCHAR_PROTOTYPE
  17.         {
  18.     /* Wait for TXE flag to be raised */
  19.     while (!LL_USART_IsActiveFlag_TXE(USART1));
  20.     LL_USART_TransmitData8(USART1, ch);
  21.     while (!LL_USART_IsActiveFlag_TC(USART1));
  22.     return ch;
  23.         }
复制代码
接收用中断方式,只要修改
void USART1_CharReception_Callback(void)
这个函数就可以了






所属标签

相似问题

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