打印

GPS信息筛选程序,请高手们帮忙

[复制链接]
1567|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
乔彬ING|  楼主 | 2009-9-14 21:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己写了一段GPS数据选择的程序,目的是把个需要用的信息放在各个数组中,然后发送出去,但我现在发现在中断里屏蔽掉发送功能之后,个数组中的数据正确,但要是加上发送功能的话,数组中的数据就不正常了,会存在丢失数据的现象,如果把发送程序提到主函数中效果也是一样的~~希望各位高手帮帮忙看下是什么问题?


#include   <C8051F340.H>  
#include   <string.h>  
#define uchar unsigned char
bit begin;//表示接收到GPS信息开头的'$'字符  1--为接收到
uchar char_count;//定义字符接收计数器
uchar comma_count;//定义逗号计数器
char xdata  buffer[50];//定义数据缓存单元
char xdata  header[6];//定义头文件字符
char xdata  time[9];//定义GPS时间
char xdata  weidu[9];//定义纬度
char xdata  nbw[1];//定义南北纬
//xdata char jingdu[9];//定义经度
//xdata char dxj[1];//定义东西经度
//xdata char quality[1];//定义GPS卫星质量

/************测试点设置********************/
char test_buffer[20];//测试
uchar test_count;//测试
bit finish;//测试
uchar length1,length2,length3,length4;
/******************************************/

void SYSCLK_INIT(void)   //使用内部12MHz晶振
{
OSCICN=0x83;
}
void PORT_INIT(void)     //配置端口,P1为输出控制口
{
XBR0=0X01;  //UART0连载P0.4 P0.5
XBR1=0X40;  //交叉开关使能
XBR2=0X00;  //UART1不连到I/O口

P0MDIN=0XFF;//不配置为模拟输入
P0MDOUT=0XFF;
P0SKIP=0XCF;//P0.4 P0.5不被交叉开关跳过,因为要使用串口0
P1MDIN=0XFF;//不配置为模拟输入
P1MDOUT=0XFF; //P1口配置为推挽输出
P1SKIP=0XFF;//被交叉开关跳过
P2MDIN=0XFF;
P2MDOUT=0xFF;
P3MDIN=0XFF;
P3MDOUT=0xFF;

}

void UART0_INIT()            //串口配置
{
PCA0MD &=0XBF; //禁止看门狗
SCON0=0X10; //波特率可编程的8位UART,UART0允许接收
TMOD=0X20;  //自动装载8位定时器
CKCON=0X08; //定时器1使用系统时钟
TH1=0x98;//波特率57600
TL1=0x98;
ES0=1; //开串口0开中断
TR1=1; //定时器1开
EA=1;  //开总中断
}

void pick_up(char message[],uchar N)  //提取信息,message【】为各信息存储数组,N为各信息长度
{
uchar i,j,m;
j=0;
m=N;
for (i=0;i  <N;i++)
     {
   message[j]=buffer[char_count-1-m];
   j++;
   m--;
  }
  message[N]='\n';
}

void send(char message[])
{
uchar n;
n=0;
while (message[n]!='\n')
       {     
     SBUF0=message[n++];
        while (TI0==0)
             {;}
        TI0=0;
    }
}

main()
{
SYSCLK_INIT();
PORT_INIT();
UART0_INIT();
begin=0;
while(1)
     {
   ;
  }
}
void UART0_receive (void) interrupt 4
{
uchar temp;
if (RI0)
    {
   EA=0;
   RI0=0;
      temp=SBUF0;
   if (temp=='$')
      {
    begin=1;        //表示接收到一条GPS信息的头字符
    char_count=0;   //接收字符数量清零
    comma_count=0;  //逗号数量清零
   }
    if (begin==1)
       {
     buffer[char_count++]=temp;
     if (temp==',')
        {
      ++comma_count; //接收到逗号,逗号计数器加1
         switch (comma_count)
           {
                      case 1: P1=0XFE;
               pick_up(header,6);//提取头信息      
                        length1=sizeof(header);             //测试点        
               //send(header);
               break;
       case 2: P1=0XFC;
               pick_up(time,9);  //提取时间  
                        length2=sizeof(time);               //测试点
               //send(time);
               break;
       case 3: P1=0XF8;
               pick_up(weidu,9); //提取纬度
                              length3=sizeof(weidu);              //测试点
               send(weidu);
               break;
                      case 4: P1=0XF0;
               pick_up(nbw,1); //提取纬度
                              length4=sizeof(nbw);              //测试点
               //send(nbw);
               break;
                      default:P1=0x01;
               break;
     }
     }
      if (temp=='*')
        {
      begin=0;  //表示一条完整的信息接收完成
      
     }
   
    }
    EA=1;
  }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝