wapeace 发表于 2019-8-5 14:49:44

STM32L476串口采用空闲中断接收数据时只接收到第一个字节

串口3中断服务程序如下:
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
        __HAL_UART_CLEAR_IT(&huart3,UART_IT_RXNE);
        user_Uart1Handler();

}

void user_Uart1Handler()
{
        if(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE)!=RESET)
{
                if(modbus.RxState==0)      
                {
                        modbus.RxState=0xaa;
                        __HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE);   
      modbus.recnt=0;                              
      modbus.rcbuf=huart3.Instance->RDR;
                }
                else if(modbus.RxState==0xaa)
    {
      modbus.rcbuf=huart3.Instance->RDR;
    }
   __HAL_UART_CLEAR_FLAG(&huart3,UART_FLAG_RXNE);
}
        if((__HAL_UART_GET_IT(&huart3,UART_IT_IDLE)!=RESET))
{
   __HAL_UART_DISABLE_IT(&huart3,UART_IT_IDLE);   
   __HAL_UART_DISABLE_IT(&huart3,UART_IT_RXNE);   
   modbus.RxState=0x55;               
}
}

问题:如采用串口调试助手发送04 03 01 03,全速运行,modbus.rcbuf中只有04,RDR寄存器中是03
请教各位大神,为何会出现这种情况,谢谢

wenyangzeng 发表于 2019-8-5 15:34:04

楼主怎么用Uart1Handler()中断函数去套用&huart3?
张冠李戴了

wapeace 发表于 2019-8-5 15:40:00

wenyangzeng 发表于 2019-8-5 15:34
楼主怎么用Uart1Handler()中断函数去套用&huart3?
张冠李戴了

那里应该是当时写错了,但是并不影响

wenyangzeng 发表于 2019-8-5 16:15:42

wapeace 发表于 2019-8-5 15:40
那里应该是当时写错了,但是并不影响

写错了改回来当然不影响。
写错了没有改回来也不影响运行就怪了。二进制的东西,0就是0,1就是1.怎么不影响?

发表于 2019-8-5 16:25:45

楼主还是单步进行测试吧。怀疑是某些变量不能达到条件导致。另外确定一下接收一个字节进入一次中断吗?中断接收完成以后是否有关闭中断?从这里看不到HAL库的操作,如果只接收一个字节,HAL驱动库执行完毕以后,会自动关闭中断。查一下中断寄存器。

wapeace 发表于 2019-8-5 16:28:32

wenyangzeng 发表于 2019-8-5 16:15
写错了改回来当然不影响。
写错了没有改回来也不影响运行就怪了。二进制的东西,0就是0,1就是1.怎么不影 ...

那只是我自己定义的函数名,改不改都不影响,谢谢

wapeace 发表于 2019-8-5 16:32:57

安 发表于 2019-8-5 16:25
楼主还是单步进行测试吧。怀疑是某些变量不能达到条件导致。另外确定一下接收一个字节进入一次中断吗?中断 ...

谢谢你。是的,接收一个字节进入一次中断,一帧数据接收完进入空闲中断,会关空闲中断,关接收中断。我再调试看看

mikecai 发表于 2019-8-5 18:32:25

我用L476,空闲中断,DMA 都 OK。参考
https://www.stmcu.org.cn/module/forum/thread-621310-1-1.html

00-405686 发表于 2019-8-6 09:02:16

你空闲中断里面关闭了接收中断,接收到一个字符后,跟着一个空闲中断,直接就只收了一个字符

wapeace 发表于 2019-8-6 09:42:05

00-405686 发表于 2019-8-6 09:02
你空闲中断里面关闭了接收中断,接收到一个字符后,跟着一个空闲中断,直接就只收了一个字符 ...

你好,谢谢你的解答。我理解的是接收完一帧数据之后才会进入空闲中断,那这种情况有什么好的解决办法吗
页: [1] 2
查看完整版本: STM32L476串口采用空闲中断接收数据时只接收到第一个字节