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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版