导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→GPS信息选择程序,请高手门帮忙下``[侨彬]

 *第48760篇: GPS信息选择程序,请高手门帮忙下``

  
楼 主:侨彬 2009年9月14日21:28
 GPS信息选择程序,请高手门帮忙下``
自己写了一段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页]


[上一篇主题]:深圳龙华,单片机开发设计.

[下一篇主题]:[原创]