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

STM32F103VE使用USART1中断接收时,无法接收超过8位数据

[复制链接]
liutaominshida 提问时间:2015-4-9 16:03 /
各位大侠,本人想实现从上位机通过串口传递固定长度16位数据到STM32的USART1口,例如在上位机上发送ABCD

串口助手

串口助手

,那么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);
}

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


收藏 评论10 发布时间:2015-4-9 16:03

举报

10个回答
stary666 回答时间:2015-4-9 16:08:11
看看datasheet,看看uart 的Control register
Mandelbrot_Set 回答时间:2015-4-9 16:35:41
usart_data_receive = (usart_data[0]<<8)+usart_data[1];

断点,add watch usart_data[0] usart_data[1]
liutaominshida 回答时间:2015-4-9 16:53:22
Mandelbrot_Set 发表于 2015-4-9 16:35
断点,add watch usart_data[0] usart_data[1]

这里进入不了,因为前面的conut计数据只会变成1,不会继续下去,也就是说只是usart_data[0]有数值
回答时间:2015-4-9 17:07:43
usart_data_receive 是多少位的?这个是程序处理的问题,而不是串口接收的问题。
liutaominshida 回答时间:2015-4-9 17:13:48
安 发表于 2015-4-9 17:07
usart_data_receive 是多少位的?这个是程序处理的问题,而不是串口接收的问题。 ...

这个定义的是16位
extern u8 usart_data[];
extern u16 usart_data_receive;
liutaominshida 回答时间:2015-4-9 17:15:22
安 发表于 2015-4-9 17:07
usart_data_receive 是多少位的?这个是程序处理的问题,而不是串口接收的问题。 ...

这个定义的是16位的
liutaominshida 回答时间:2015-4-9 17:18:45
安 发表于 2015-4-9 17:07
usart_data_receive 是多少位的?这个是程序处理的问题,而不是串口接收的问题。 ...

这个定义的是16位
extern u8 usart_data[];
extern u16 usart_data_receive;

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];
             }
     }
在软件仿真时,进入中断之后,程序只执行到这一步USART_ClearITPendingBit(USART1,USART_IT_RXNE),不去判断count的值,退出中断.串口助手发送出来的是ABCD,但看DR中的值确是CD
回答时间:2015-4-9 17:33:12
本帖最后由 安 于 2015-4-9 17:35 编辑

你看一下接收缓冲区中的数据.先给16位的数据赋值,然后再加.
回答时间:2015-4-9 17:33:24
或者改成count >0
12下一页

所属标签

相似问题

官网相关资源

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