定时发送数据的时候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
可以设置为每接收一个字节,进一次中断回调函数,对数据处理,这样效率低些,但是还是可行的。 ...
是的,我就是这样处理的。
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__);
}
} dma传输 串口接受数据,定时器来判断超时是否接受数据完成。DMA接受+IDLE中断。是这么么 feixiang20 发表于 2018-5-31 22:39
串口接受数据,定时器来判断超时是否接受数据完成。DMA接受+IDLE中断。是这么么 ...
是的,不过我只用了串口接收中断,没用DMA和IDLE 本帖最后由 电子星辰 于 2018-6-1 10:51 编辑
xiaojie0513 发表于 2018-5-31 12:26
dma传输
DMA传输确实可以,谢谢你。
我用的是DMA循环接收模式,每次接收1字节,测试未出现串口接收中断的不能接收现象。
电子星辰 发表于 2018-5-31 12:01
是的,我就是这样处理的。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
就是这样的,接收完了一个字节后,马上做判断处理
页:
[1]