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

再次质疑 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版