uCOS-II论坛
直播中

周慧仁

7年用户 17经验值
擅长:嵌入式技术
私信 关注
[问答]

自己在测试接收到的一帧GPS数据是否正确时,始终检查不到帧头,不知道怎么回事?不知道是不是自己程序逻辑有问题。

采用的是串口中断接收数据,是将接收到的数据放到接受缓存器U2RBR里面的,读GPS的时候就是读的U2RBR的内容,GPS的协议是标准的NMEA0813协议,我用串口发一帧数据如$BDRMC,133413.00,A,4717.13981,N,00833.86256,E,2.584,151.37,190203,,,A*6A
单片机用的是LPC1768,采用的ucosii系统,之前自己想的是在串口接受中断触发后,就发一个信号量给一个任务,让这个任务读GPS和处理GPS。而且中断里面发信号量要死机。在测试的时候是不是也不能在一帧数据的中间打断点测试??代码不好看就发图片的哦
****读取Gps通信任务如下*************************************************************************************************
void   GPSRead(void)
{        
uint8  static  check_return[2]={0,0};
uint32  i, m;   
         if(gps_data_num>=199)
                            {
                            UartStatus_gps=0;
                            gps_data_check_num=0;      
                            gps_data_num=0;
                            }
                   switch(UartStatus_gps)
                   {
                            case  START_GPS_STATUS:              //START_GPS_STATUS=0
                                               if((uint8)UART2_GetChar=='$')
                                               {
                                           gps_data_num=0;
                                                                 for(i=0;i<200;i++)
                                                                 {
                                                                 gps_data=0;
                                                                 }
                                                                 gps_data[gps_data_num++]=(uint8)U2RBR;
                                                            UartStatus_gps++;
                                               }
                                               break;
                            case  JUDGE_GPS_GPRMC:               //JUDGE_GPS_GPRMC=1
                                          if((gps_data_num>0)&&(gps_data_num<200))
                                                             {                              
gps_data[gps_data_num++]=(uint8)U2RBR;//U2RBR接收缓冲寄存器。内含下一个要读取的已接收字符
                                                                  if( gps_data_num==6)
                                                                           {
                                                                                                       if((gps_data[1]=='B')&&(gps_data[2]=='D')&&(gps_data[3]=='R')
                                                                                                                &&(gps_data[4]=='M')&&(gps_data[5]=='C')) //判断是否是BDRMC,如果是继续接收                                                                                                                                             {
                                                                                                                  UartStatus_gps++;
                                                                                                                 }
                                                                                                                else
                                                                                                                 {
                                                                                                                         UartStatus_gps=0;
                                                                                                                         gps_data_num=0;
                                                                                                                 }
                                                                            }
                                          }
                                          else
                                          {
                                          UartStatus_gps=0;
                                                        gps_data_num=0;
                                          }
                                      break;
串口2接受函数如下:
int UART2_GetChar(void)
{
       while(!(U2LSR & 0x01));   /*bit0 0为空,1为接收到数据 */
       return(U2RBR);         /*读取接收数据  接收缓冲寄存器,内含下一个要读取的已接收字符*/
}
串口接受中断函数如下:
voidUART2_IRQHandler (void)
{
  //uint32_t  SystemFrequency;                                    /* ClockVariable               */
// uint8_t   GucRcvNew;                                         /*  串口接收新数据的标志        */
  uint8_t   GucRcvBuf[25];                                 /*  串口接收数据缓冲区         */
  uint32_t  GulNum;                                      /*  串口接收数据的个数          */     
  OSIntEnter();
         while ((U2IIR & 0x01) == 0)         /* 判断是否有中断挂起  */
          {                              
        switch (U2IIR & 0x0E)           /*  判断中断标志     */
                     {                                 
            case 0x04:                                                /*  接收数据中断               */   
                for (GulNum = 0; GulNum < 8;GulNum++)                  /*  连续接收8个字节             */
                                {                                                                           
                  GucRcvBuf[GulNum] = U2RBR;
// OSSemPost(task2_Sem);
                  }
                break;           
            case 0x0C:                                                 /*  字符超时中断               */              
                while ((U2LSR & 0x01) ==0x01)
                                {                                                /*  判断数据是否接收完毕        */
                      // GucRcvBuf[GulNum] =U2RBR;   
//OSSemPost(task2_Sem);
                               if(GulNum<0x19)
                                                       GulNum=0;
                                                         else
                                                         GulNum++;
                        }
                break;              
              default:
                break;
          }
    }
      OSIntExit();
}

  • gps3.png
  • gps1.png
  • gps2.png
已退回10积分

回帖(1)

周慧仁

2017-7-19 11:51:02
相关程序图片如下
举报

更多回帖

×
20
完善资料,
赚取积分