消息关闭
    暂无新消息!
请问大家有没有做过GPS的项目?
自己在测试接收到的一帧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[i]=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);         /*读取接收数据  接收缓冲寄存器,内含下一个要读取的已接收字符*/
}
串口接受中断函数如下:
void UART2_IRQHandler (void)
{
  //uint32_t   SystemFrequency;                                    /* Clock Variable               */
 // 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();
}

3个回答

︿ 2
始终检查不到帧头,是不是说明 LZ 的环境已经能正常接收到 GPS 数据?
如果是,数据是什么格式的?

BD 开头的协议,是北斗 GPS;LZ 你的 GPS 是什么模块呢?
︿ 0
天线装了吗?天线与接收器之间怎么连线的?屏蔽层呢?能搜到几颗卫星?在室内一般是搜不到卫星的