你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
wapeace 提问时间:2019-8-5 14:49 /
串口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[modbus.recnt++]=huart3.Instance->RDR;
                }
                else if(modbus.RxState==0xaa)
    {
      modbus.rcbuf[modbus.recnt++]=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
请教各位大神,为何会出现这种情况,谢谢
收藏 评论13 发布时间:2019-8-5 14:49

举报

13个回答
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.怎么不影响?

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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
楼主还是单步进行测试吧。怀疑是某些变量不能达到条件导致。另外确定一下接收一个字节进入一次中断吗?中断 ...

谢谢你。是的,接收一个字节进入一次中断,一帧数据接收完进入空闲中断,会关空闲中断,关接收中断。我再调试看看
慎微 回答时间:2019-8-5 18:32:25
我用L476,空闲中断,DMA 都 OK。参考
https://www.stmcu.org.cn/module/forum/thread-621310-1-1.html

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

294479435@qq.co 回答时间:2019-8-6 09:02:16
你空闲中断里面关闭了接收中断,接收到一个字符后,跟着一个空闲中断,直接就只收了一个字符
wapeace 回答时间:2019-8-6 09:42:05
00-405686 发表于 2019-8-6 09:02
你空闲中断里面关闭了接收中断,接收到一个字符后,跟着一个空闲中断,直接就只收了一个字符 ...

你好,谢谢你的解答。我理解的是接收完一帧数据之后才会进入空闲中断,那这种情况有什么好的解决办法吗
wapeace 回答时间:2019-8-6 09:46:37
mikecai 发表于 2019-8-5 18:32
我用L476,空闲中断,DMA 都 OK。参考
https://www.stmcu.org.cn/module/forum/thread-621310-1-1.html ...

谢谢,我参考一下
294479435@qq.co 回答时间:2019-8-6 10:36:43
wapeace 发表于 2019-8-6 09:42
你好,谢谢你的解答。我理解的是接收完一帧数据之后才会进入空闲中断,那这种情况有什么好的解决办法吗 ...

这就要根据你的应用了,一般来说就使用接收中断即可了,不用空闲中断,接收数据是否完毕根据通信协议判断

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wapeace 回答时间:2019-8-6 10:51:55
00-405686 发表于 2019-8-6 10:36
这就要根据你的应用了,一般来说就使用接收中断即可了,不用空闲中断,接收数据是否完毕根据通信协议判断 ...

采用定时器的方式判定一帧数据接收完成与否是已经实现了,看到网上说空闲中断更好,结果试试出现问题
294479435@qq.co 回答时间:2019-8-6 11:03:25
wapeace 发表于 2019-8-6 10:51
采用定时器的方式判定一帧数据接收完成与否是已经实现了,看到网上说空闲中断更好,结果试试出现问题 ...

如果发送方发送数据byte之间没有加空闲位就可以用

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版