OpenEdv-开源电子网

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

关于stm32 串口接收数据丢失的问题

[复制链接]

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-9-6
在线时间
23 小时
发表于 2018-9-29 16:48:52 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 周兵 于 2018-9-29 16:50 编辑

本人最近在做iap相关的升级时   遇到串口无法正常接收数据的问题   我的想法是通过上位机将数据打包为1k数据 在加上帧头帧尾

帧头   总包     包号      数据        帧尾     数据长度高八位    数据长度第八位
A0      25        00         ....          0A        94                         0C



现在遇到的问题是我通过串口助手 可以很清楚的知道我上位机的  数据正确 那么我通过stm32中断的接收返回  发现数据异常
[mw_shl_code=applescript,true]void uart_init(u32 bound){
  //GPIO¶Ë¿úéèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //ê1ÄüUSART1£¬GPIOAê±Öó
  
        //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9
   
  //USART1_RX          GPIOA.103õê¼»ˉ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.10  

  //Usart1 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇàÕ¼óÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //×óóÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
  
   //USART 3õê¼»ˉéèÖÃ

        USART_InitStructure.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½

  USART_Init(USART1, &USART_InitStructure); //3õê¼»ˉ′®¿ú1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿aÆô′®¿ú½óêüÖD¶Ï
  USART_Cmd(USART1, ENABLE);                    //ê1Äü′®¿ú1




}




#if EN_USART1_RX   //èç1ûê1Äüá˽óêÕ
void USART1_IRQHandler(void)                        //′®¿ú1ÖD¶Ï·tÎñ3ìDò
        {
        u8 Res;
        unsigned int hbit,lbit;
//                hbit = (a)&0xf0>>4;
//                lbit = (a)&0x0f;
               
#if SYSTEM_SUPPORT_OS                 //èç1ûSYSTEM_SUPPORT_OSÎaÕæ£¬ÔòDèòaÖ§3ÖOS.
        OSIntEnter();   
#endif
               
               
               
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
                {
                 
        //        Res =USART_ReceiveData(USART1);//(USART1->DR);        //¶á衽óêÕμ½μÄêy¾Y
                                Res =USART1->DR;
                       
                       
//                       
//                if(USART_RX_CNT<USART_REC_LEN)
//                {
//                        printf("%X",Res);
//                        USART_RX_BUF[USART_RX_CNT]=Res;
//                        USART_RX_CNT++;                                                                                                      
//                }        
                       
                       
                       
                //hbit = ((Res)&0xf0)>>4;
        //        lbit = (Res)&0x0f;
        //        printf("%X__%d__%d__\r\n",Res,hbit,lbit);

                 
     
               
                        if(Res!=0x0A&&state==6)
                {
                        hbit = ((Res)&0xf0)>>4;
                  lbit = (Res)&0x0f;
                        printf("6.");
                        printf("%X\r\n",Res);
                        state_head[state-1]=hbit*16+lbit;
                        USART_RX_CNT_L=hbit*16+lbit;
                        USART_RX_CNT_Z= USART_RX_CNT_L +USART_RX_CNT_H;
                       
                        state=0;
                }       
                       
                       
               
                        if(Res!=0x0A&&state==5)
                {
                  hbit = ((Res)&0xf0)>>4;
                  lbit = (Res)&0x0f;
                        printf("5.");
                        //printf("%X\r\n",Res);
                        state_head[state-1]=hbit*16*16*16+lbit*16*16;
                        USART_RX_CNT_H=hbit*16*16*16+lbit*16*16;
                        state=6;
                }
                       
                       
                        if(Res==0x0A&&state==4)
                {
                        printf("4.");
                //        printf("%X\r\n",Res);
                        state_head[state-1]=Res;
                        state=5;
                }
                       
                       
                       
                       
                if((MAGE_BAOLEN==MAGE_BAOLEN_Z)&&state==3)
                {
                       
                //        printf("%X F\r\n",Res);
                        USART_RX_BUF[USART_RX_CNT]=Res;
                        USART_RX_CNT++;
                        printf("%d.\r\n",USART_RX_CNT);
                        if(USART_RX_CNT==USART_RX_CNT_Z)
           state=4;
                }
                       
                       
                       
                       
                       
                       
                       
                        if((MAGE_BAOLEN<MAGE_BAOLEN_Z)&& (state==3))
                {
                       
                //        printf("%X f\r\n",Res);
                        USART_RX_BUF[USART_RX_CNT]=Res;
                        USART_RX_CNT++;
                        printf("%d.\r\n",USART_RX_CNT);
                        if(USART_RX_CNT==1024*(MAGE_BAOLEN+1))
           state=4;
                }
                       
                       
                       
                       
                        if(state==2&&Res<=MAGE_BAOLEN_Z)
                {
                        hbit = ((Res)&0xf0)>>4;
            lbit = (Res)&0x0f;
                        state_head[state]=hbit*10+lbit;       
                        MAGE_BAOLEN=hbit*10+lbit;
                        state=3;
//                        printf("3.");
                //        printf("%X\r\n",Res);
                        //printf("%d \r\n",MAGE_BAOLEN);
                }
               
               
                if(state==1)
                {
                        hbit = ((Res)&0xf0)>>4;
                  lbit = (Res)&0x0f;
                        state_head[state]=hbit*10+lbit;
                        MAGE_BAOLEN_Z=hbit*10+lbit;
                        state=2;
                        printf("2.");
                //        printf("%X\r\n",Res);
                        //printf("%d\r\n",MAGE_BAOLEN_Z);
                }
               
       
                if(Res==0xA0&&state==0)
                {
                        printf("1.");
                //        printf("%X\r\n",Res);
                        state_head[state]=Res;
                        state=1;
                }
               
               

               
               
                       
                if((USART_RX_CNT==USART_RX_CNT_Z)&&(USART_RX_CNT==MAGE_BAOLEN_Z)&&(USART_RX_CNT!=0))
                {
               
                        USART_RX_END=1;
                }else
                {
                       
                        USART_RX_END=0;
                }

                 
                 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        }         
                 
                 
                 
#if SYSTEM_SUPPORT_OS         //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntExit();                                                                                           
#endif
}
#endif       
[/mw_shl_code]

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

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-9-6
在线时间
23 小时
 楼主| 发表于 2018-9-29 16:55:37 | 显示全部楼层
C:\Users\Suprint-01\Desktop\text\113.png
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-9-6
在线时间
23 小时
 楼主| 发表于 2018-9-29 16:57:09 | 显示全部楼层
现在 只能接收到前两位数据就停下来了
回复

使用道具 举报

28

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
488
金钱
488
注册时间
2016-9-29
在线时间
113 小时
发表于 2018-9-29 17:24:26 | 显示全部楼层
强迫症患者在这里说一句,请把文字格式转换为“GB2312”格式再复制粘贴过来,不然注释都变乱码了
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-9-29 18:39:39 | 显示全部楼层
估计要用上CRC校验
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-9-6
在线时间
23 小时
 楼主| 发表于 2018-9-30 08:42:26 | 显示全部楼层
各位大神 stm32 在接收数据的时候我在给上位机发送数据是不是有很大的影响啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 10:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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