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

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
废鱼 回答时间:2015-4-9 17:36:17
(usart_data[0]<<8)+usart_data[1];
这个算法可能是溢出了.

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版