liutaominshida 发表于 2015-4-9 16:03:06

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

各位大侠,本人想实现从上位机通过串口传递固定长度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 = USART_ReceiveData(USART1);
         USART_ClearITPendingBit(USART1,USART_IT_RXNE);
         if (count > 1 )
             {
                  count = 0;
               usart_data_receive = (usart_data<<8)+usart_data;
             }
   }
   //发送数据
   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);
}

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


stary666 发表于 2015-4-9 16:08:11

看看datasheet,看看uart 的Control register

Mandelbrot_Set 发表于 2015-4-9 16:35:41

usart_data_receive = (usart_data<<8)+usart_data;
断点,add watch usart_data usart_data

liutaominshida 发表于 2015-4-9 16:53:22

Mandelbrot_Set 发表于 2015-4-9 16:35
断点,add watch usart_data usart_data

这里进入不了,因为前面的conut计数据只会变成1,不会继续下去,也就是说只是usart_data有数值

发表于 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 = USART_ReceiveData(USART1);
         USART_ClearITPendingBit(USART1,USART_IT_RXNE);
         if (count > 1 )
             {
                  count = 0;
               usart_data_receive = (usart_data<<8)+usart_data;
             }
   }
在软件仿真时,进入中断之后,程序只执行到这一步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
页: [1] 2
查看完整版本: STM32F103VE使用USART1中断接收时,无法接收超过8位数据