OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4380|回复: 2

USART串口中断接收数据丢失

[复制链接]

3

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-4-9
在线时间
1 小时
发表于 2015-4-9 20:09:32 | 显示全部楼层 |阅读模式
5金钱
各位大侠,本人想实现从上位机通过串口传递固定长度16位数据到STM32的USART1口,例如在上位机上发送ABCD


但事实上进入中断之后,接收到数据只是CD,AB没有办法接收到。这是什么情况呢?
代码如下:
USART1初始化代码
void DALI_USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
/**************************************************************************/
USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_Init(USART1,&USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
}
USART1中断处理程序如下:
void USART1_IRQHandler(void)
{
      int i= 0;
      //标志位置位
      Interrupt_flag=1;
      DALI_Usart1_flag=1;
     // 指示灯点亮
     GPIO_SetBits(GPIOE,GPIO_Pin_7);
     //特殊需要,关断其他中断,不允许其他中断进入
     TIM_ITConfig( TIM2, TIM_IT_CC2 , DISABLE );
     TIM_ITConfig( TIM4, TIM_IT_CC1 , DISABLE);
     DALI_EXTI_Disable();
     //防溢出
    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)!=RESET)
       {
         USART_ClearFlag(USART1,USART_FLAG_ORE);      
         USART_ReceiveData(USART1);   
       }
   //接收数据
   if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
      {
           usart_data[count++] = USART_ReceiveData(USART1);
           USART_ClearITPendingBit(USART1,USART_IT_RXNE);
           if (count > 1 )
             {
                  count = 0;
                 usart_data_receive = (usart_data[0]<<8)+usart_data[1];
             }
     }
     //发送数据
     if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
     {
             USART_ClearITPendingBit(USART1,USART_IT_TXE);
             printf("%c",i_dali_receive);
             USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
      //加短延时,让发送更稳定
      while(i<500)
        {   
              i++;
         }
     }
     //关闭指示灯
     GPIO_ResetBits(GPIOE,GPIO_Pin_7);
}

请各位大侠指点一下迷津,已经调试多次了,没有办法解决啊



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11557
金钱
11557
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-4-9 21:41:49 | 显示全部楼层
中断函数里做了这么多事,犯大忌。
回复

使用道具 举报

3

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-4-9
在线时间
1 小时
 楼主| 发表于 2015-4-10 08:21:47 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
大神啊,我在中断当中只是单纯的使用如下代码:
//接收数据
   if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
      {
           usart_data[count++] = USART_ReceiveData(USART1);
           USART_ClearITPendingBit(USART1,USART_IT_RXNE);
           if (count > 1 )
             {
                  count = 0;
                 usart_data_receive = (usart_data[0]<<8)+usart_data[1];
             }
     }
结果也是一样一样的哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 20:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表