新手求教为什么串口接收数据总丢包

2019-07-14 19:12发布

接收数据为:BB 97 11 30 00 11 22 33 44 55 66 77 88 99 00 11 22 FD 6F 03 1A 0D 0A 1.png

发送端一直不定时发此类数据

但是我用STM32F103RCT6单片机接收丢包挺多,丢包的频率很规律  应该是我程序代码没写严谨,求大神指点


void Init_NVIC(void)
{         
        NVIC_InitTypeDef NVIC_InitStructure;                        //¶¨ÒåÒ»¸öNVICÏòÁ¿±í½á¹¹Ìå±äÁ¿

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //ÉèÖÃÖжÏ×é Ϊ2

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                //ÅäÖô®¿Ú1ΪÖжÏÔ´
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //ÉèÖÃÕ¼ÏÈÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //ÉèÖø±ÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //ʹÄÜ´®¿Ú1ÖжÏ
        NVIC_Init(&NVIC_InitStructure);                                                                                //¸ù¾Ý²ÎÊý³õʼ»¯ÖжϼĴæÆ÷
        
        
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                //ÅäÖô®¿Ú1ΪÖжÏÔ´
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =        0;           //ÉèÖÃÕ¼ÏÈÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                               //ÉèÖø±ÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //ʹÄÜ´®¿Ú1ÖжÏ
        NVIC_Init(&NVIC_InitStructure);                                                                                //¸ù¾Ý²ÎÊý³õʼ»¯ÖжϼĴæÆ÷

        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;                                  //ÅäÖô®¿Ú1ΪÖжÏÔ´
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;           //ÉèÖÃÕ¼ÏÈÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                               //ÉèÖø±ÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //ʹÄÜ´®¿Ú1ÖжÏ
        NVIC_Init(&NVIC_InitStructure);                                                                                //¸ù¾Ý²ÎÊý³õʼ»¯ÖжϼĴæÆ÷
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                                //ÅäÖô®¿Ú1ΪÖжÏÔ´
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;           //ÉèÖÃÕ¼ÏÈÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                               //ÉèÖø±ÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //ʹÄÜ´®¿Ú1ÖжÏ
        NVIC_Init(&NVIC_InitStructure);                                                                                //¸ù¾Ý²ÎÊý³õʼ»¯ÖжϼĴæÆ÷

        
}



void Init_Usart2(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;                                        //¶¨ÒåÒ»¸öGPIO½á¹¹Ìå±äÁ¿

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO ,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ,ENABLE);               
                                                                                                                        //ʹÄܸ÷¸ö¶Ë¿ÚʱÖÓ£¬ÖØÒª£¡£¡£¡

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //ÅäÖô®¿Ú·¢ËͶ˿ڹҽӵ½9¶Ë¿Ú
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                           //¸´Óù¦ÄÜÊä³ö¿ªÂ©
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //ÅäÖö˿ÚËÙ¶ÈΪ50M
  GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //¸ù¾Ý²ÎÊý³õʼ»¯GPIOA¼Ä´æÆ÷        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;          //½ÓÊÕ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //¸¡¿ÕÊäÈë(¸´Î»×´Ì¬);                                          
  GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //¸ù¾Ý²ÎÊý³õʼ»¯GPIOA¼Ä´æÆ÷        
}


void Usart2_Configuration(uint32_t BaudRate)
{
        USART_InitTypeDef USART_InitStructure;                                                                    //¶¨ÒåÒ»¸ö´®¿Ú½á¹¹Ìå

        USART_InitStructure.USART_BaudRate            = BaudRate ;                                  //²¨ÌØÂÊ115200
        USART_InitStructure.USART_WordLength          = USART_WordLength_8b;         //´«Êä¹ý³ÌÖÐʹÓÃ8λÊý¾Ý
        USART_InitStructure.USART_StopBits            = USART_StopBits_1;                 //ÔÚÖ¡½áβ´«Êä1λֹͣλ
        USART_InitStructure.USART_Parity              = USART_Parity_No ;                 //ÆæżʧÄÜ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//Ó²¼þÁ÷ʧÄÜ
        USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx; //½ÓÊպͷ¢ËÍģʽ
        USART_Init(USART2, &USART_InitStructure);                                                                //¸ù¾Ý²ÎÊý³õʼ»¯´®¿Ú¼Ä´æÆ÷
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);                                                        //ʹÄÜ´®¿ÚÖжϽÓÊÕ
        USART_Cmd(USART2, ENABLE);                                                                                             //ʹÄÜ´®¿ÚÍâÉè
}


void USART2_IRQHandler()        
{
        int i=0;
        u8 a=0;
        extern u8 UART2_Save_data_box[UART2_Save_data_box_number];                          //·ÅÖÃUART2½ÓÊÕµ½µÄ×Ö½Ú  ÐèÒªÒç³ö¹é0
        extern u16 UART2_Save_data_box_pointer;                                                                  //·ÅÖÃUART2½ÓÊÕµ½µÄ×Ö½ÚºÐ×ÓÏÂÒ»¸öÊý¾Ý·ÅÖõÄλÖÃÖ¸Ïò±êÖ¾        ÐèÒªÒç³ö¹é0
        extern u32 EPC_box[EPC_number];
        extern u16 EPC_box_pointer;
        extern u8 back_correct;
        extern u32 error1;
        extern u32 error2;
        extern u32 error3;
        extern u32 EPC_count_l;
        extern u32 EPC_count_h;
        extern u32 timer1;
        extern u8 zisuo3;
        
        
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)           //¶ÁÈ¡½ÓÊÕÖжϱê־λUSART_IT_RXNE
                                                                                                                //USART_FLAG_RXNE:½ÓÊÕÊý¾Ý¼Ä´æÆ÷·Ç¿Õ±ê־λ
                                                                                                                //1£ºÃ¦×´Ì¬  0£º¿ÕÏÐ(ûÊÕµ½Êý¾Ý£¬µÈ´ý¡£¡£¡£)
        {
               
               
                if(UART2_Save_data_box[0]==0xBB)                                                                                          //ÅжÏÊý¾Ý°üÍ·
                {
                        UART2_Save_data_box[UART2_Save_data_box_pointer]=USART_ReceiveData(USART2);       //¼ÌÐø´æ´¢Êý¾Ý
                        UART2_Save_data_box_pointer++;
                        
                        
                        /*
                        if(UART2_Save_data_box[1]==0x98&&UART2_Save_data_box[5]==0x0D && UART2_Save_data_box[6]==0x0A)   //ÅжÏÊý¾Ý°üβ
                        {
                                for(i=1;i<4;i++)                                                  //¼ÆËãУÑéÖµ
                                {
                                        a+=(u8)UART2_Save_data_box;
                                }
                                if(a==UART2_Save_data_box[4])                            //УÑé³É¹¦
                                {
                                        if(UART2_Save_data_box[3]==0x01)
                                        {
                                                back_correct=1;
                                                OUT2_LED=0;
                                        }
                                        else
                                        {
                                                back_correct=2;
                                        }
                                }
                                for(i=0;i<UART2_Save_data_box_number;i++)
                                {
                                        UART2_Save_data_box=0;                                   //Ò»µ©Åжϵ½Êý¾Ý°üµÄβ²¿ÔòÊý×é³õʼ»¯
                                }
                                UART2_Save_data_box_pointer=1;                                //Ò»µ©Åжϵ½Êý¾Ý°üµÄβ²¿ÔòÖÃ1
                        }
                        
                        
                        
                        else */if(UART2_Save_data_box[1]==0x97&&UART2_Save_data_box[21]==0x0D && UART2_Save_data_box[22]==0x0A)   //ÅжÏÊý¾Ý°üβ
                        {
                                for(i=1;i<20;i++)                                                  //¼ÆËãУÑéÖµ
                                {
                                        a+=(u8)UART2_Save_data_box;
                                }
                                if(a==UART2_Save_data_box[20])                            //УÑé³É¹¦
                                {
                                        for(i=0;i<3;i++)
                                        {
                                                EPC_box[EPC_box_pointer]=(UART2_Save_data_box[i*4+5]<<24)+(UART2_Save_data_box[i*4+1+5]<<16)+(UART2_Save_data_box[i*4+2+5]<<8)+(UART2_Save_data_box[i*4+3+5]<<0);                  //´æ´¢EPC
                                                EPC_box_pointer++;
                                        }
                                        zisuo3=0;
                                        OUT1_jingbao=1;             //Êä³ö±¨¾¯
                                        timer1=0;                                //¼ÆʱÇå0
                                                
                                        EPC_count_l++;              //±êÇ©×ÜÊý+1
                                        if(EPC_count_l>=1000000000)
                                        {
                                                EPC_count_l=0;
                                                EPC_count_h++;
                                        }
                                }
                                else
                                {
                                        error1++;                                                      //żȻ´íÎó ´íÎó±êÖ¾¼Ó1
                                }
                                for(i=0;i<UART2_Save_data_box_number;i++)
                                {
                                        UART2_Save_data_box=0;                                   //Ò»µ©Åжϵ½Êý¾Ý°üµÄβ²¿ÔòÊý×é³õʼ»¯
                                }
                                UART2_Save_data_box_pointer=1;                                //Ò»µ©Åжϵ½Êý¾Ý°üµÄβ²¿ÔòÖÃ1
                        }
                        
                        
                        
                        
                        
                        else if(UART2_Save_data_box_pointer>=23)                                                                                                //ż¶ûÐÔµÄÊý¾Ý´íÎó   ¿ªÊ¼Çå0
                        {
                                for(i=0;i<UART2_Save_data_box_number;i++)
                                {
                                        UART2_Save_data_box=0;                             
                                }
                                UART2_Save_data_box_pointer=1;     
                                error2++;                                                      //żȻ´íÎó ´íÎó±êÖ¾¼Ó1
                        }
                        
                        
                        
                        if(EPC_box_pointer>=EPC_number)
                        {
                                EPC_box_pointer=0;
                        }
                }
               
               
               
                else if(UART2_Save_data_box[0]==0x00)                                                              //Èç¹ûÉϸöÊý¾Ý²»ÊÇÊý¾Ý°üÍ·
                {
                        UART2_Save_data_box[0]=USART_ReceiveData(USART2);                 //´¢´æÊý¾Ýµ½UART2
                }
                else
                {
                        error3++;
                        UART2_Save_data_box[0]=USART_ReceiveData(USART2);                 //´¢´æÊý¾Ýµ½UART2
                }
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);                                                                                   //Çå³ýÖжϱê־λ
        }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
HARRY007
1楼-- · 2019-07-15 04:32
串口接收中断里只做接收数据的缓存,处理拿到外面去做。
人中狼
2楼-- · 2019-07-15 06:37
对于包内数据的判断应该是在完整的接收了一个数据包之后才做的
aa27838955
3楼-- · 2019-07-15 09:31
人中狼 发表于 2017-10-30 12:03
对于包内数据的判断应该是在完整的接收了一个数据包之后才做的

我的也是接收完了才做判断啊
aa27838955
4楼-- · 2019-07-15 12:05
 精彩回答 2  元偷偷看……
aa27838955
5楼-- · 2019-07-15 16:12
我重新贴一下代码

  1. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. ** 函数名称: USART1_Send_Byte
  3. ** 功能描述: 串口发送一个字符串
  4. ** 参数描述:Data 要发送的数据
  5. ** 作   者: Dream
  6. ** 日   期: 2011年6月20日
  7. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  8. void USART2_Send_Byte(uint16_t Data)
  9. {
  10.         while(!USART_GetFlagStatus(USART2,USART_FLAG_TXE));          //USART_GetFlagStatus:得到发送状态位
  11.                                                                                                                   //USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
  12.         USART_SendData(USART2,Data);                                                  //发送一个字符
  13. }
  14. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  15. ** 函数名称: USART1_Send_Byte
  16. ** 功能描述: 串口发送一个字符串
  17. ** 参数描述:Data 要发送的数据
  18. ** 作   者: Dream
  19. ** 日   期: 2011年6月20日
  20. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  21. uint8_t USART2_Receive_Byte(void)
  22. {
  23.            while(!(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))); //USART_GetFlagStatus:得到接收状态位
  24.                                                                                                                    //USART_FLAG_RXNE:接收数据寄存器非空标志位
  25.                                                                                                                    //1:忙状态  0:空闲(没收到数据,等待。。。)
  26.         return USART_ReceiveData(USART2);                                           //接收一个字符
  27. }
  28. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  29. ** 函数名称: Usart_Init
  30. ** 功能描述: 串口引脚初始化
  31. ** 参数描述: 无
  32. ** 作   者: Dream
  33. ** 日   期: 2011年6月20日
  34. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  35. void Init_Usart2(void)
  36. {
  37.         GPIO_InitTypeDef GPIO_InitStructure;                                        //定义一个GPIO结构体变量

  38.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO ,ENABLE);
  39.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ,ENABLE);               
  40.                                                                                                                         //使能各个端口时钟,重要!!!

  41.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //配置串口发送端口挂接到9端口
  42.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                           //复用功能输出开漏
  43.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //配置端口速度为50M
  44.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //根据参数初始化GPIOA寄存器       

  45.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;          //接收
  46.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //浮空输入(复位状态);                                          
  47.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //根据参数初始化GPIOA寄存器       
  48. }
  49. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  50. ** 函数名称: Usart_Configuration
  51. ** 功能描述: 串口配置函数
  52. ** 参数描述: BaudRate设置波特率
  53. ** 作   者: Dream
  54. ** 日   期: 2011年6月20日
  55. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  56. void Usart2_Configuration(uint32_t BaudRate)
  57. {
  58.         USART_InitTypeDef USART_InitStructure;                                                                    //定义一个串口结构体

  59.         USART_InitStructure.USART_BaudRate            = BaudRate ;                                  //波特率115200
  60.         USART_InitStructure.USART_WordLength          = USART_WordLength_8b;         //传输过程中使用8位数据
  61.         USART_InitStructure.USART_StopBits            = USART_StopBits_1;                 //在帧结尾传输1位停止位
  62.         USART_InitStructure.USART_Parity              = USART_Parity_No ;                 //奇偶失能
  63.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流失能
  64.         USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx; //接收和发送模式
  65.         USART_Init(USART2, &USART_InitStructure);                                                                //根据参数初始化串口寄存器
  66.         USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);                                                        //使能串口中断接收
  67.         USART_Cmd(USART2, ENABLE);                                                                                             //使能串口外设
  68. }
  69. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  70. ** 函数名称: USART1_IRQHandler
  71. ** 功能描述: 串口中断函数
  72. ** 参数描述: 无
  73. ** 作   者: Dream
  74. ** 日   期: 2011年6月20日
  75. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  76. void USART2_IRQHandler()       
  77. {
  78.         int i=0;
  79. //        u8 a=0;
  80.         extern u8 UART2_Save_data_box[UART2_Save_data_box_number];                          //放置UART2接收到的字节  需要溢出归0
  81.         extern u16 UART2_Save_data_box_pointer;                                                                  //放置UART2接收到的字节盒子下一个数据放置的位置指向标志        需要溢出归0
  82.         extern u32 EPC_box[EPC_number];
  83.         extern u16 EPC_box_pointer;
  84.         extern u8 back_correct;
  85.         extern u32 error1;
  86.         extern u32 error2;
  87.         extern u32 error3;
  88.         extern u32 EPC_count_l;
  89.         extern u32 EPC_count_h;
  90.         extern u32 timer1;
  91.         extern u8 zisuo3;
  92.        
  93.   u8 a=0;
  94.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)           //读取接收中断标志位USART_IT_RXNE
  95.                                                                                                                 //USART_FLAG_RXNE:接收数据寄存器非空标志位
  96.                                                                                                                 //1:忙状态  0:空闲(没收到数据,等待。。。)
  97.         {/*
  98.                 a=USART_ReceiveData(USART2);
  99.                 if(a==0xBB)
  100.                 {
  101.                         UART2_Save_data_box[UART2_Save_data_box_pointer]=a;       //继续存储数据
  102.                 }
  103.                 else if(
  104.                 UART2_Save_data_box_pointer++;
  105.                 if(UART2_Save_data_box_pointer>=UART2_Save_data_box_number)
  106.                 {
  107.                         UART2_Save_data_box_pointer=0;
  108.                 }        */
  109.                
  110.        
  111.                 if(UART2_Save_data_box[0]==0xBB)                                                                                          //判断数据包头
  112.                 {
  113.                         UART2_Save_data_box[UART2_Save_data_box_pointer]=USART_ReceiveData(USART2);       //继续存储数据
  114.                         UART2_Save_data_box_pointer++;
  115.                        
  116.                        
  117.                         if(UART2_Save_data_box[1]==0x98 && UART2_Save_data_box[5]==0x0D && UART2_Save_data_box[6]==0x0A)   //判断数据包尾
  118.                         {
  119.                                 for(i=1;i<4;i++)                                                  //计算校验值
  120.                                 {
  121.                                         a+=(u8)UART2_Save_data_box[i];
  122.                                 }
  123.                                 if(a==UART2_Save_data_box[4])                            //校验成功
  124.                                 {
  125.                                         if(UART2_Save_data_box[3]==0x01)
  126.                                         {
  127.                                                 back_correct=1;
  128.                                                 OUT2_LED=0;
  129.                                         }
  130.                                 }
  131.                                 for(i=0;i<UART2_Save_data_box_number;i++)
  132.                                 {
  133.                                         UART2_Save_data_box[i]=0;                                   //一旦判断到数据包的尾部则数组初始化
  134.                                 }
  135.                                 UART2_Save_data_box_pointer=1;                                //一旦判断到数据包的尾部则置1
  136.                         }
  137.                        
  138.                        
  139.                         else if(UART2_Save_data_box[1]==0x97 && UART2_Save_data_box[21]==0x0D && UART2_Save_data_box[22]==0x0A)   //判断数据包尾
  140.                         {
  141.                                 for(i=1;i<20;i++)                                                  //计算校验值
  142.                                 {
  143.                                         a+=(u8)UART2_Save_data_box[i];
  144.                                 }
  145.                                 if(a==UART2_Save_data_box[20])                            //校验成功
  146.                                 {
  147.                                         for(i=0;i<3;i++)
  148.                                         {
  149.                                                 EPC_box[EPC_box_pointer]=(UART2_Save_data_box[i*4+5]<<24)+(UART2_Save_data_box[i*4+1+5]<<16)+(UART2_Save_data_box[i*4+2+5]<<8)+(UART2_Save_data_box[i*4+3+5]<<0);                  //存储EPC
  150.                                                 EPC_box_pointer++;
  151.                                         }
  152.                                         zisuo3=0;
  153.                                         OUT1_jingbao=1;             //输出报警
  154.                                         timer1=0;                                //计时清0
  155.                                                
  156.                                         EPC_count_l++;              //标签总数+1
  157.                                         if(EPC_count_l>=1000000000)
  158.                                         {
  159.                                                 EPC_count_l=0;
  160.                                                 EPC_count_h++;
  161.                                         }
  162.                                 }
  163.                                 else
  164.                                 {
  165.                                         error1++;                                                      //偶然错误 错误标志加1
  166.                                 }
  167.                                 for(i=0;i<UART2_Save_data_box_number;i++)
  168.                                 {
  169.                                         UART2_Save_data_box[i]=0;                                   //一旦判断到数据包的尾部则数组初始化
  170.                                 }
  171.                                 UART2_Save_data_box_pointer=1;                                //一旦判断到数据包的尾部则置1
  172.                         }
  173.                        
  174.                        
  175.                        
  176.                        
  177.                        
  178.                         else if(UART2_Save_data_box_pointer>=UART2_Save_data_box_number)                                                                                                //偶尔性的数据错误   开始清0
  179.                         {
  180.                                 for(i=0;i<UART2_Save_data_box_number;i++)
  181.                                 {
  182.                                         UART2_Save_data_box[i]=0;                             
  183.                                 }
  184.                                 UART2_Save_data_box_pointer=1;     
  185.                                 error2++;                                                      //偶然错误 错误标志加1
  186.                         }
  187.                        
  188.                        
  189.                        
  190.                         if(EPC_box_pointer>=EPC_number)
  191.                         {
  192.                                 EPC_box_pointer=0;
  193.                         }
  194.                 }
  195.                
  196.                
  197.                
  198.                 else if(UART2_Save_data_box[0]==0x00)                                                              //如果上个数据不是数据包头
  199.                 {
  200.                         UART2_Save_data_box[0]=USART_ReceiveData(USART2);                 //储存数据到UART2
  201.                 }
  202.                 else
  203.                 {
  204.                         error3++;
  205.                         UART2_Save_data_box[0]=USART_ReceiveData(USART2);                 //储存数据到UART2
  206.                 }
  207.                 USART_ClearITPendingBit(USART2,USART_IT_RXNE);                                                                                   //清除中断标志位
  208.         }
  209. }
复制代码
人中狼
6楼-- · 2019-07-15 21:29
你的程序有些乱,注释有不能正常显示,只能说我的思路了,作为接收数据包来说,应该是先判断接收到的是否是数据包的包头,当接收到数据包包头时,存储包头,同时UART2_Save_data_box_number = 1,后面则时判断接收的数据是否是包尾,当接收到包尾时,则认为数据包接收完毕,如果时定长的数据包,则可以同时判断数据包长度是否正确。
你的程序虽然有对一些数据包的特定数据进行判断处理,但这些都是基于接收完数据包的操作,并没有看到接收数据包过程的操作。

一周热门 更多>