论坛风格切换切换到宽版
  • 4667阅读
  • 16回复

GPS中断还是没有解析成功(BG4UVR大哥) [复制链接]

上一主题 下一主题
离线lulei
 
发帖
47
只看楼主 倒序阅读 0楼 发表于: 2008-05-31
郁闷死了。快跳楼了。最基本的我随便在switch 语句里加个灯点亮来判断都不亮郁闷
最基本的解析都不对,郁闷。不知道啥原因你们帮忙看看啊!我接收完协议前面的几个字母接收到$然后点亮灯都不亮。不知道啥毛病,在pc上可以显示gps信息,我用232试过了。说明初始化没问题的啊。
//串口初始化程序
void sys_int()
{
  light=1;
     light1=1;
     tmod=0x20; //t1自动从装,方式2
     scon=0x50;//方式1
     th1=0xfd; //晶振为11.0592m 波特率为9600
     tl1=0xfd;
     ea=1;   //开总中断
     es=1;   //开串行中断
     tr1=1;       //开串行口波特率发生器(t1)
}
//串口接收程序
void uart(void) interrupt 4
{
  char tmp;
     ri=0;
  tmp=sbuf;
    switch(tmp)
    {
        case '$':
          cmd_number=0;     //命令类型清空
          mode=1;           //接收命令模式
          byte_count=0;     //接收位数清空
          break;
              light1=0;
        case ',':
          seg_count++;     //逗号计数加1
          byte_count=0;
          break;
        case '*':
          switch(cmd_number)
          {
            case 1:
                buf_full|=0x01;
                break;
                                   light1=0;
            case 2:
                buf_full|=0x02;
                break;
            case 3:
                buf_full|=0x04;
                break;
          }
          mode=0;
          break;
离线lulei
发帖
47
只看该作者 1楼 发表于: 2008-05-31
希望bg4uvr大哥帮帮忙看下!
在线BG4UVR
发帖
11288
只看该作者 2楼 发表于: 2008-05-31
1、在ouravr听说你用的是好像12m的晶振
2、你的gps是9600的么?我的可是。。

另外拜托下次不要在求助帖标题里写我呼号~
在线BG4UVR
发帖
11288
只看该作者 3楼 发表于: 2008-05-31
case '$':
cmd_number=0; //命令类型清空
mode=1; //接收命令模式
byte_count=0; //接收位数清空
break;
light1=0;


还有你觉得你的灯能亮么?
离线lulei
发帖
47
只看该作者 4楼 发表于: 2008-05-31
我的是9600的。我现在换成11.0529了。我感觉能点亮啊,因为我感觉这个循环可以进去!
离线lulei
发帖
47
只看该作者 5楼 发表于: 2008-05-31
哦看到了。应该放到break的上面。但是我郁闷的是,我拿别你的那个avr的程序改成51咋没反应就郁闷
在线BG4UVR
发帖
11288
只看该作者 6楼 发表于: 2008-05-31
仔细看4楼的帖子,看出问题后你就升华了
离线lulei
发帖
47
只看该作者 7楼 发表于: 2008-05-31
你看就这么简单的几句,不知道什么毛病。
                  void uart(void) interrupt 4
{
  char tmp;
     ri=0;
  tmp=sbuf;
    switch(tmp)
    {
        case '$':
          cmd_number=0;     //命令类型清空
          mode=1;           //接收命令模式
          byte_count=0;     //接收位数清空
                       light1=0;
          break;                  
        case ',':
          seg_count++;     //逗号计数加1
          byte_count=0;
          break;
        case '*':
          switch(cmd_number)
          {
            case 1:
                buf_full|=0x01;
                break;
                                   light1=0;
            case 2:
                buf_full|=0x02;
                break;
            case 3:
                buf_full|=0x04;
                break;
          }
          mode=0;
          break;
        default:
          if(mode==1)
               {
            //命令种类判断
            cmd[byte_count]=tmp;         //接收字符放入类型缓存
            if(byte_count>=4)
                 {           //如果类型数据接收完毕,判断类型
                if(cmd[0]=='g')
                     {
                                          light=0;
                  if(cmd[1]=='p')
                       {
                    if(cmd[2]=='g')
                         {
                        if(cmd[3]=='g')
                             {
                          if(cmd[4]=='a')
                               {
                            cmd_number=1;
                            mode=2;
                            seg_count=0;
                            byte_count=0;
                               }
                             }
                        else if(cmd[3]=='s')
                             {
                          if(cmd[4]=='v')
                               {
                            cmd_number=2;
                            mode=2;
                            seg_count=0;
                            byte_count=0;
                               }
                             }
                         }
                    else if(cmd[2]=='r')
                         {
                        if(cmd[3]=='m')
                             {
                          if(cmd[4]=='c')
                               {
                            cmd_number=3;
                            mode=2;
                            seg_count=0;
                            byte_count=0;
                               }
                             }
                         }
                  }
                }
            }
          }
          else if(mode==2)
               {
            //接收数据处理
            switch (cmd_number)
            {
                case 1:           //类型1数据接收。gpgga
                  switch(seg_count)
                  {
                    case 2:                     //纬度处理
                        if(byte_count<9)
                             {
                          wd[byte_count]=tmp;
                             }
                        break;
                    case 3:                     //纬度方向处理
                        if(byte_count<1)
                             {
                          wd_a=tmp;
                             }
                        break;
                    case 4:                     //经度处理
                        if(byte_count<10)
                             {
                          jd[byte_count]=tmp;
                             }
                        break;
                    case 5:                     //经度方向处理
                        if(byte_count<1)
                             {
                          jd_a=tmp;
                             }
                        break;
                    case 6:                     //定位判断
                        if(byte_count<1)
                             {
                          dw[byte_count]=tmp;
                             }
                        break;
                    case 7:                     //定位使用的卫星数
                        if(byte_count<2)
                             {
                          use_sat[byte_count]=tmp;
                             }
                        break;
                    case 9:                     //高度处理
                        if(byte_count<6)
                             {
                          high[byte_count]=tmp;
                             }
                        break;
                  }
                  break;
                case 2:           //类型2数据接收。gpgsv
                  switch(seg_count)
                  {
                    case 3:                     //天空中的卫星总数
                        if(byte_count<2)
                             {
                          total_sat[byte_count]=tmp;
                             }
                        break;
                  }
                  break;
                case 3:           //类型3数据接收。gprmc
                  switch(seg_count)
                  {
                    case 7:                     //速度处理
                        if(byte_count<5)
                             {
                          speed[byte_count]=tmp;
                             }
                        break;
                    case 8:                     //方位角处理
                        if(byte_count<5)
                             {
                          angle[byte_count]=tmp;
                             }
                        break;
                  }
                  break;
            }
          }
          byte_count++;     //接收数位加1
          break;
    }
}
离线lulei
发帖
47
只看该作者 8楼 发表于: 2008-05-31
大哥麻烦你指点下。谢谢,真的很头疼
离线lulei
发帖
47
只看该作者 9楼 发表于: 2008-05-31
帮个忙啊!急死人了
在线BG4UVR
发帖
11288
只看该作者 10楼 发表于: 2008-05-31
大体看了一下,没看出啥明显的问题
在线BG4UVR
发帖
11288
只看该作者 11楼 发表于: 2008-05-31
好久没搞过51了,感觉很生疏。

看你的样子,似乎很着急。但你哪怕在google上搜索一下“gps解码”,都应该能搜索到我的老博客上的2051解码gps的帖子,那里有完整的51下的源代码…… 那个帖子都放在那有1年多了……
离线阳光999
发帖
52
只看该作者 12楼 发表于: 2008-05-31
建议先把接收到的内容显示在lcd上或从串口送回pc机用串口助手显示,确定问题出在哪再想办法解决
也可以先用pc机串口模拟gps输出字符串进行调试
离线bd7rf
发帖
10148
只看该作者 13楼 发表于: 2008-06-01
把ti也清零试试。
离线lulei
发帖
47
只看该作者 14楼 发表于: 2008-06-03
现在可以显示了,就是屏幕有些地方会乱奔,前段时间没调试出来我怀疑是仿真器的功率不够,所以没啥反应。现在把它烧进片子里就好了现在!现在还在完善,有时候还会死屏郁闷。
离线红猪
发帖
4980
只看该作者 15楼 发表于: 2008-06-03
努力才会有收获。
离线fghlw
发帖
163
只看该作者 16楼 发表于: 2008-06-08
觉得应该缓冲下