jjbboox 发表于 2018-4-23 09:39:43

放在轮询里面又有何不可呢?
反正当上次接收还没有结束的时候调了也没用,但是当上次接收结束了,调一下又进入接收状态了呀,本来HAL库就是这么设计的。
非要在中断回调中再开启中断接收,似乎没有必要。而且万一这个时候由于其他原因串口接收被占了,你调用中断接收失败,整个链条就断了。还是放在while(1)中保险。

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) 函数中最后增加
LL_USART_EnableIT_RXNE(USART1);发送用printf函数
#include "stdio.h"
#ifdef __GNUC__
    /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
       set to 'Yes') calls __io_putchar() */
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/*******************************************************************************
* Function Name: PUTCHAR_PROTOTYPE
* Description    : Retargets the C library printf function to the USART.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
        PUTCHAR_PROTOTYPE
        {
    /* Wait for TXE flag to be raised */
    while (!LL_USART_IsActiveFlag_TXE(USART1));
    LL_USART_TransmitData8(USART1, ch);
    while (!LL_USART_IsActiveFlag_TC(USART1));
    return ch;
        }接收用中断方式,只要修改
void USART1_CharReception_Callback(void)
这个函数就可以了






页: 1 [2] 3 4
查看完整版本: 再次质疑 HAL_UART_Receive_IT函数