电子星辰 发表于 2018-5-31 10:01:25

定时发送数据的时候HAL_UART_Receive_IT问题

本帖最后由 电子星辰 于 2018-6-6 11:19 编辑

当我用串口HAL_UART_Transmit函数定时向上位机发送数据的同时,我需要不定时不定长的接收上位机数据。我用的是HAL_UART_Receive_IT函数,当我接收频率稍高就会进不了HAL_UART_Receive_IT函数。
那么除了将__HAL_LOCK(huart),__HAL_UNLOCK(huart)语句注释,和改为用HAL_UART_Transmit_IT发送外,还有没有其它方法?

解决方案:
目前为止我已知的方法包括:
1.将接收中断改为DMA接收。2.将__HAL_LOCK(huart),__HAL_UNLOCK(huart)语句注释。
1.DMA具体解决请看该贴:https://www.stmcu.org.cn/module/forum/thread-616097-1-1.html
另外我猜测:1.不使用HAL_UART_Transmit重定向的printf,改用HAL_UART_Transmit_IT发送。2.用寄存器或标准库对printf重定向。可能也可以解决该问题,暂未验证。

zhao.zhao 发表于 2018-5-31 11:41:53

可以设置为每接收一个字节,进一次中断回调函数,对数据处理,这样效率低些,但是还是可行的。

电子星辰 发表于 2018-5-31 12:01:44

zhao.zhao 发表于 2018-5-31 11:41
可以设置为每接收一个字节,进一次中断回调函数,对数据处理,这样效率低些,但是还是可行的。 ...

是的,我就是这样处理的。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(USART_RX_STA < UART_RecSize)
        {
                r = aRxBuffer;
                USART_RX_STA++;
        }
        timer_count = 0;
        if(HAL_UART_Receive_IT(&huart1,&aRxBuffer,1) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}
}

xiaojie0513 发表于 2018-5-31 12:26:56

dma传输

feixiang20 发表于 2018-5-31 22:39:14

串口接受数据,定时器来判断超时是否接受数据完成。DMA接受+IDLE中断。是这么么

电子星辰 发表于 2018-6-1 09:37:05

feixiang20 发表于 2018-5-31 22:39
串口接受数据,定时器来判断超时是否接受数据完成。DMA接受+IDLE中断。是这么么 ...

是的,不过我只用了串口接收中断,没用DMA和IDLE

电子星辰 发表于 2018-6-1 10:48:20

本帖最后由 电子星辰 于 2018-6-1 10:51 编辑

xiaojie0513 发表于 2018-5-31 12:26
dma传输
DMA传输确实可以,谢谢你。

我用的是DMA循环接收模式,每次接收1字节,测试未出现串口接收中断的不能接收现象。

zhao.zhao 发表于 2018-6-1 11:45:56

电子星辰 发表于 2018-5-31 12:01
是的,我就是这样处理的。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{


就是这样的,接收完了一个字节后,马上做判断处理
页: [1]
查看完整版本: 定时发送数据的时候HAL_UART_Receive_IT问题