自己写了一段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;
}
} |