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

查看: 2780|回复: 7

求助串口中断执行不正确是否和没接串口有关系

[复制链接]

11

主题

7

回帖

0

蝴蝶豆

初级会员

最后登录
2020-11-18
发表于 2011-4-2 10:32:18 | 显示全部楼层 |阅读模式
大家好:
     请看下面的程序,串口的设置没有问题,能够进入中断。但是当进入发送中断的时候,执行
    if(USART1_TxHead != USART1_TxTail)
      {
     USART_SendData(USART2, USART1_TxBuf[USART1_TxTail++]);
     USART1_TxTail %= USART_TX_BUFFER_SIZE;
   }
,因为我的长度是10个,因此要发送10次,但是实际上只发送1次,程序就跳出了。同时继续向下执行,可是也没有返回发送完成的标志。因此程序就反复的进入中断。请问这是为什么?我没有接串口连调,只是单机测试,是不是和这个有关系?
void USART2_IRQHandler(void)
{
   if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)   //判断发生接收中断
    {
   USART_ClearITPendingBit(USART2,   USART_IT_RXNE);       //清除中断标志 
      USART1_RxBuf[USART1_RxHead++] = USART_ReceiveData(USART2);//接收数据
      USART1_RxHead %= USART_RX_BUFFER_SIZE;
      while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){}//等待发送结束
     }
//发送中断
    if (USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
    {
    if(USART1_TxHead != USART1_TxTail)
      {
     USART_SendData(USART2, USART1_TxBuf[USART1_TxTail++]);
     USART1_TxTail %= USART_TX_BUFFER_SIZE;
   }
  else
       {
     delay_us(700);
     }
       USART_ClearITPendingBit(USART2,USART_IT_TXE);
       USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
       USART_ITConfig(USART2, USART_IT_TC, ENABLE);
    }
//发送完成
    if (USART_GetITStatus(USART1, USART_IT_TC) != RESET)
    {
     USART_ClearITPendingBit(USART2,USART_IT_TC);
     USART_ITConfig(USART2, USART_IT_TC, DISABLE);
   }
}
 
回复

使用道具 举报

16

主题

121

回帖

0

蝴蝶豆

初级会员

最后登录
2020-8-5
发表于 2011-4-2 10:58:50 | 显示全部楼层

RE:求助串口中断执行不正确是否和没接串口有关系

首先要指出你一个错误就是取发送完成标志USART_GetITStatus(USART1, USART_IT_TC) != RESET,你取的是USART1的发送完成标志而且不是USART2的.
回复 支持 反对

使用道具 举报

16

主题

121

回帖

0

蝴蝶豆

初级会员

最后登录
2020-8-5
发表于 2011-4-2 11:04:19 | 显示全部楼层

RE:求助串口中断执行不正确是否和没接串口有关系

第二,按照你的程序思路,如果有发送中断而且USART1_TxHead != USART1_TxTail就发一字节,然后清除USART_IT_TXE标志位,USART2发送禁止,使能USART2发送完成中断,然后去判断USART2发送完成中断有没有.
对于你的程序思路有点问题.
回复 支持 反对

使用道具 举报

16

主题

121

回帖

0

蝴蝶豆

初级会员

最后登录
2020-8-5
发表于 2011-4-2 11:06:09 | 显示全部楼层

RE:求助串口中断执行不正确是否和没接串口有关系

根据你的思路,你在发送第一次的时候就已经把发送中断一直禁止掉,所以发送中断只会在第一次发生,
回复 支持 反对

使用道具 举报

16

主题

121

回帖

0

蝴蝶豆

初级会员

最后登录
2020-8-5
发表于 2011-4-2 11:08:20 | 显示全部楼层

RE:求助串口中断执行不正确是否和没接串口有关系

然后在你的检测发送完成中断这里也有点不当之处,因为你在把数据发完之后才去使能发送完成标志,怎么可能捕捉得到当时的发送完成标志,就像你去搭车一样,你等车开了,然后再去等这班车有没有开,那你能等得到吗?
回复 支持 反对

使用道具 举报

16

主题

121

回帖

0

蝴蝶豆

初级会员

最后登录
2020-8-5
发表于 2011-4-2 11:10:06 | 显示全部楼层

RE:求助串口中断执行不正确是否和没接串口有关系

以上就是我个人认为你程序有问题之处,如有不当的地方请指教
回复 支持 反对

使用道具 举报

16

主题

121

回帖

0

蝴蝶豆

初级会员

最后登录
2020-8-5
发表于 2011-4-2 11:41:21 | 显示全部楼层

RE:求助串口中断执行不正确是否和没接串口有关系

对于刚才的发送中断补充下,你这样的做法想了下也没什么大问题,不过还是希望你在发送之前就使能的话可能效果好点。
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-4-2 14:16:25 | 显示全部楼层

RE:求助串口中断执行不正确是否和没接串口有关系

不用这么麻烦,看下面代码:
if(USART_GetITStatus(USART1,USART_IT_TXE)==SET)
{
if( USART1_TxTail < USART1_TxHead )
{
USART_SendData(USART1, USART1_TxBuf[USART1_TxTail++]);
}
else
{
USART_ITConfig(USART1,USART_IT_TXE ,DISABLE);
USART_ClearITPendingBit(USART1,USART_IT_TXE);
}
}
回复 支持 反对

使用道具 举报

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