在利用f020的Uart1接收解析GPS(达伽马的SR-088V)并通过Uart0发送PC时发现,无论GPS是否有数据进来,通过串口小助手看到的结果都是FF,已排除硬件上的原因(硬件我用的是新华龙提供的开发板套件),也用其他的范例程序测试过,2个串口都能正常收发,复位也没问题,现将自己的程序贴上,请各位大侠帮忙看看,到底哪里有错误
//22.1184MHz外晶振,Uart1 9600波特率用于接收GPS,Uart0 1200波特率发送PC
#include<C8051F020.h>
#define uchar unsigned char
#define uint unsigned int
sbit neg=P0^4; //通过这个管脚输出一个低脉冲
bit flag; //串口收发标志位
bit ReceivingF = 0;
bit EndF = 0;
bit GGAF = 0;
uchar GPS_time[9]; //UTC时间
uchar xdata GPS_wd[12]; //纬度
uchar xdata GPS_jd[13]; //经度
uchar GPS_alt[8]; //海拔
uchar GPS_sv[3]; //使用卫星
uchar idata GPS[46]; //将各提取数据合并,便于输出
uchar Segment; //逗号计数
uchar Bytes_counter;
//段字节计数器
uchar Command;
void GPGGA(uchar); //解析GPGGA段语句
void gps(uchar);
void Creat_GPS();
void Creat_GPS(void) //将上述5个解析出的GPS数组合1
{
uint i,j,k,l,m;
for(i=0;i<9;i++)
{
GPS[i]=GPS_time[i];
}
for(j=0;j<12;j++)
{
GPS[j+9]=GPS_wd[j];
}
for(k=0;k<13;k++)
{
GPS[k+21]=GPS_jd[k];
}
for(l=0;l<3;l++)
{
GPS[l+34]=GPS_sv[l];
}
for(m=0;m<8;m++)
{
GPS[m+37]=GPS_alt[m];
}
}
void gps(uchar tmp)
{
if(tmp == '$') //起始标志
{
Command = 0;
ReceivingF = 1;
Bytes_counter = 0;
Segment = 0; //清空语句段计数器
return;
}
if(ReceivingF)
{
if(tmp == ',')
{
++Segment;
Bytes_counter = 0; //清空段字节计数器
return;
}
if(tmp == '*') //收到结束标志
{
ReceivingF = 0;
EndF = 1;
return;
}
if(Segment == 0)
{
if(Bytes_counter == 4) //段0,语句类型判断
switch(tmp)
{
case 'G':Command = 1; //语句类型 $GPGGA
GGAF = 1;
break;
default:Command = 0; //非有效数据类型,终止当前数据接收
ReceivingF = 0;
break;
}
}
else
{
switch(Command)
{
case 1:GPGGA(tmp);
break;
}
}
++Bytes_counter;
}
return;
}
void GPGGA(uchar tmp)
{
switch(Segment)
{
case 1:if(Bytes_counter == 2 || Bytes_counter == 5) //$GPGGA段1,UTC时间,hhmmss(时分秒)格式,取前6位 转换为HH:MM:SS格式
{
GPS_time[Bytes_counter] = ':';
++Bytes_counter;
}
if(Bytes_counter<8)
GPS_time[Bytes_counter] = tmp;
GPS_time[8] = '\0';
break;
case 2:if(Bytes_counter == 3) //$GPGGA 段2处理 纬度ddmm.mmmm(度分)格式
{
GPS_wd[Bytes_counter] = '.'; //接收第二个字节后插入'.'
++Bytes_counter;
GPS_wd[11] = '\0';
}
if(Bytes_counter == 0)
++Bytes_counter;
GPS_wd[Bytes_counter] = tmp;
break;
case 3:GPS_wd[0] = tmp; //$GPGGA第3段处理 纬度半球N(北半球)或S(南半球)
break;
case 4:if(Bytes_counter == 4) //$GPGGA 段4处理 经度dddmm.mmmm(度分)格式
{
GPS_jd[Bytes_counter] = '.'; //接收第3个字节后插入'.'
++Bytes_counter;
GPS_jd[12] = '\0';
}
if(Bytes_counter == 0)
++Bytes_counter;
GPS_jd[Bytes_counter] = tmp;
break;
case 5:GPS_jd[0] = tmp; //$GPGGA第5段处理 经度半球E(东经)或W(西经)
break;
case 7:if(Bytes_counter<2) //$GPGGA第7段处理? 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
GPS_sv[Bytes_counter] = tmp;
GPS_sv[2] = '\0';
break;
case 9:if(Bytes_counter<7) //$GPGGA第9段处理 海拔高度(-9999.9~99999.9)
{
GPS_alt[Bytes_counter] = tmp;
GPS_alt[Bytes_counter+1] = '\0';
}
break;
default:break;
}
}
void Timer_Init()
{
CKCON = 0x60;
}
void UART0_Init() //Send
{
PCON = 0x00;
SCON0 = 0x50;
T2CON = 0x34;
RCAP2L = 0xC0;
RCAP2H = 0xFD;
}
void UART1_Init() //Receive
{
SCON1 = 0x50;
T4CON = 0x34;
RCAP4L = 0xB8;
RCAP4H = 0xFF;
}
void Port_IO_Init()
{
XBR0 = 0x04;
XBR1 = 0x00;
XBR2 = 0x44;
P0MDOUT = 0x05;
}
void Oscillator_Init()
{
int c = 0;
OSCXCN = 0x67;
for (c = 0; c < 3000; c++);
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x88;
}
void Init_Device(void) //各功能初始化,这块我是通过SILICON自带的configure wizard写入的,自己也反复验证过,没问题
{
Timer_Init();
UART0_Init();
UART1_Init();
Port_IO_Init();
Oscillator_Init();
}
void Delay()
{
uint b;
for(b=0;b<60000;b++);
}
void Uart1_ISR(void)interrupt 20 //从这里开始到下面的Send_String,我怀疑问题出在这里,通过UART0的DEBUG窗口看,SBUF0一直是00没变过
{ uchar king;
if((SCON1&0x01)==0x01)
{
SCON1&=0xFE;
king=SBUF1;
gps(king);
flag=1;
}
}
void Send0_Char(uchar ch)
{
SBUF0 = ch;
while(TI0 == 0);
TI0 = 0;
}
void Send_String(uchar *str,uint Len)
{
uint a=0;
do
{
Send0_Char(*(str+a));
a++;
}
while(a<Len);
}
void main(void)
{
WDTCN = 0xDE;
WDTCN = 0xAD; //关狗
Init_Device();
EIE2=0x40;
//开启串口1中断,即ES1=1
IE=0x80;
//开总中断,即EA=1
while(1)
{
neg=1;
{
if(flag==1)
{
flag=0;
Creat_GPS();
Send_String(GPS,46);
}
}
Delay();
neg=0;
}
} |