微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手求教为什么串口接收数据总丢包

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

时间:10-02 整理:3721RD 点击:
接收数据为:BB 97 11 30 00 11 22 33 44 55 66 77 88 99 00 11 22 FD 6F 03 1A 0D 0A


发送端一直不定时发此类数据
但是我用STM32F103RCT6单片机接收丢包挺多,丢包的频率很规律  应该是我程序代码没写严谨,求大神指点

void Init_NVIC(void)
{         
        NVIC_InitTypeDef NVIC_InitStructure;                        //?¨ò?ò???NVIC?òá?±í?á11ì?±?á?
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //éè???D??×é ?a2
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                //????′??ú1?a?D???′
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //éè?????èó??è??
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //éè???±ó??è??
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //ê1?ü′??ú1?D??
        NVIC_Init(&NVIC_InitStructure);                                                                                //?ù?Y2?êy3?ê??ˉ?D????′??÷
        
        
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                //????′??ú1?a?D???′
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =        0;           //éè?????èó??è??
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                               //éè???±ó??è??
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //ê1?ü′??ú1?D??
        NVIC_Init(&NVIC_InitStructure);                                                                                //?ù?Y2?êy3?ê??ˉ?D????′??÷
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;                                  //????′??ú1?a?D???′
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;           //éè?????èó??è??
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                               //éè???±ó??è??
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //ê1?ü′??ú1?D??
        NVIC_Init(&NVIC_InitStructure);                                                                                //?ù?Y2?êy3?ê??ˉ?D????′??÷
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                                //????′??ú1?a?D???′
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;           //éè?????èó??è??
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                               //éè???±ó??è??
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //ê1?ü′??ú1?D??
        NVIC_Init(&NVIC_InitStructure);                                                                                //?ù?Y2?êy3?ê??ˉ?D????′??÷
        
}

void Init_Usart2(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;                                        //?¨ò?ò???GPIO?á11ì?±?á?
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO ,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ,ENABLE);               
                                                                                                                        //ê1?ü?÷?????úê±?ó£???òa£?£?£?
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //????′??ú·¢?í???ú1ò?óμ?9???ú
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                           //?′ó?1|?üê?3??a??
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //???????ú?ù?è?a50M
  GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //?ù?Y2?êy3?ê??ˉGPIOA??′??÷        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;          //?óê?
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //????ê?è?(?′??×′ì?);                                          
  GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //?ù?Y2?êy3?ê??ˉGPIOA??′??÷        
}

void Usart2_Configuration(uint32_t BaudRate)
{
        USART_InitTypeDef USART_InitStructure;                                                                    //?¨ò?ò???′??ú?á11ì?
        USART_InitStructure.USART_BaudRate            = BaudRate ;                                  //2¨ì??ê115200
        USART_InitStructure.USART_WordLength          = USART_WordLength_8b;         //′?ê?1y3ì?Dê1ó?8??êy?Y
        USART_InitStructure.USART_StopBits            = USART_StopBits_1;                 //?ú???á?2′?ê?1??í£?1??
        USART_InitStructure.USART_Parity              = USART_Parity_No ;                 //????ê§?ü
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ó2?tá÷ê§?ü
        USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx; //?óê?oí·¢?í?£ê?
        USART_Init(USART2, &USART_InitStructure);                                                                //?ù?Y2?êy3?ê??ˉ′??ú??′??÷
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);                                                        //ê1?ü′??ú?D???óê?
        USART_Cmd(USART2, ENABLE);                                                                                             //ê1?ü′??úíaéè
}

void USART2_IRQHandler()        
{
        int i=0;
        u8 a=0;
        extern u8 UART2_Save_data_box[UART2_Save_data_box_number];                          //·???UART2?óê?μ?μ?×??ú  Dèòaò?3?1é0
        extern u16 UART2_Save_data_box_pointer;                                                                  //·???UART2?óê?μ?μ?×??úoD×ó??ò???êy?Y·???μ????????ò±ê??        Dèòaò?3?1é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)           //?áè??óê??D??±ê????USART_IT_RXNE
                                                                                                                //USART_FLAG_RXNE:?óê?êy?Y??′??÷·???±ê????
                                                                                                                //1£o?|×′ì?  0£o???D(??ê?μ?êy?Y£?μè′y?£?£?£)
        {
               
               
                if(UART2_Save_data_box[0]==0xBB)                                                                                          //?D??êy?Y°üí·
                {
                        UART2_Save_data_box[UART2_Save_data_box_pointer]=USART_ReceiveData(USART2);       //?ìD?′?′¢êy?Y
                        UART2_Save_data_box_pointer++;
                        
                        
                        /*
                        if(UART2_Save_data_box[1]==0x98&&UART2_Save_data_box[5]==0x0D && UART2_Save_data_box[6]==0x0A)   //?D??êy?Y°ü?2
                        {
                                for(i=1;i<4;i++)                                                  //????D£?é?μ
                                {
                                        a+=(u8)UART2_Save_data_box;
                                }
                                if(a==UART2_Save_data_box[4])                            //D£?é3é1|
                                {
                                        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;                                   //ò?μ??D??μ?êy?Y°üμ??22??òêy×é3?ê??ˉ
                                }
                                UART2_Save_data_box_pointer=1;                                //ò?μ??D??μ?êy?Y°üμ??22??ò??1
                        }
                        
                        
                        
                        else */if(UART2_Save_data_box[1]==0x97&&UART2_Save_data_box[21]==0x0D && UART2_Save_data_box[22]==0x0A)   //?D??êy?Y°ü?2
                        {
                                for(i=1;i<20;i++)                                                  //????D£?é?μ
                                {
                                        a+=(u8)UART2_Save_data_box;
                                }
                                if(a==UART2_Save_data_box[20])                            //D£?é3é1|
                                {
                                        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;             //ê?3?±¨?ˉ
                                        timer1=0;                                //??ê±??0
                                                
                                        EPC_count_l++;              //±ê??×üêy+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;                                   //ò?μ??D??μ?êy?Y°üμ??22??òêy×é3?ê??ˉ
                                }
                                UART2_Save_data_box_pointer=1;                                //ò?μ??D??μ?êy?Y°üμ??22??ò??1
                        }
                        
                        
                        
                        
                        
                        else if(UART2_Save_data_box_pointer>=23)                                                                                                //????D?μ?êy?Y′í?ó   ?aê???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)                                                              //è?1?é???êy?Y2?ê?êy?Y°üí·
                {
                        UART2_Save_data_box[0]=USART_ReceiveData(USART2);                 //′¢′?êy?Yμ?UART2
                }
                else
                {
                        error3++;
                        UART2_Save_data_box[0]=USART_ReceiveData(USART2);                 //′¢′?êy?Yμ?UART2
                }
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);                                                                                   //??3y?D??±ê????
        }
}

error2 和 error3  都有错误  但是error1一直为0   说明校验是成功的

串口接收中断里只做接收数据的缓存,处理拿到外面去做。

对于包内数据的判断应该是在完整的接收了一个数据包之后才做的

我的也是接收完了才做判断啊

我把处理数据的地方给注释掉了  也一样

我重新贴一下代码


  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.     &n

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top