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
请教各位大神,为何会出现这种情况,谢谢
楼主怎么用Uart1Handler()中断函数去套用&huart3?
张冠李戴了 wenyangzeng 发表于 2019-8-5 15:34
楼主怎么用Uart1Handler()中断函数去套用&huart3?
张冠李戴了
那里应该是当时写错了,但是并不影响 wapeace 发表于 2019-8-5 15:40
那里应该是当时写错了,但是并不影响
写错了改回来当然不影响。
写错了没有改回来也不影响运行就怪了。二进制的东西,0就是0,1就是1.怎么不影响? 楼主还是单步进行测试吧。怀疑是某些变量不能达到条件导致。另外确定一下接收一个字节进入一次中断吗?中断接收完成以后是否有关闭中断?从这里看不到HAL库的操作,如果只接收一个字节,HAL驱动库执行完毕以后,会自动关闭中断。查一下中断寄存器。 wenyangzeng 发表于 2019-8-5 16:15
写错了改回来当然不影响。
写错了没有改回来也不影响运行就怪了。二进制的东西,0就是0,1就是1.怎么不影 ...
那只是我自己定义的函数名,改不改都不影响,谢谢 安 发表于 2019-8-5 16:25
楼主还是单步进行测试吧。怀疑是某些变量不能达到条件导致。另外确定一下接收一个字节进入一次中断吗?中断 ...
谢谢你。是的,接收一个字节进入一次中断,一帧数据接收完进入空闲中断,会关空闲中断,关接收中断。我再调试看看 我用L476,空闲中断,DMA 都 OK。参考
https://www.stmcu.org.cn/module/forum/thread-621310-1-1.html 你空闲中断里面关闭了接收中断,接收到一个字符后,跟着一个空闲中断,直接就只收了一个字符 00-405686 发表于 2019-8-6 09:02
你空闲中断里面关闭了接收中断,接收到一个字符后,跟着一个空闲中断,直接就只收了一个字符 ...
你好,谢谢你的解答。我理解的是接收完一帧数据之后才会进入空闲中断,那这种情况有什么好的解决办法吗
页:
[1]
2