中级会员
 
- 积分
- 213
- 金钱
- 213
- 注册时间
- 2013-6-18
- 在线时间
- 0 小时
|

楼主 |
发表于 2013-7-12 15:33:24
|
显示全部楼层
回复【32楼】正点原子:
---------------------------------
void USART2_IRQHandler(void) //串口2中断接收 GPS通讯协议
{
if(USART2->SR&(1<<5))//接收到数据 判断sr寄存器的第五位,即RXNE位是否是1. 1有数据0没有。
{
res=USART2->DR;
switch(res)
{
case '$':
mod_cmd=0;
mod=1; //接收命令模式
byte_count=0; //接收位数清空
// LCD_ShowChar(66,70,res,16,0); //$
break;
case ',':
seg_count++; //逗号计数加1
byte_count=0;
// LCD_ShowChar(74,70,res,16,0); //,
break;
case '*': //接收完成
if(mod_cmd==1)
ReceiveBit=1;//gprmc
if(mod_cmd==2)
ReceiveBit1=1;//gga
mod=0;
// LCD_ShowChar(82,70,res,16,0); //*
break;
default:
if(mod==1)
{
//命令种类判断
cmd[byte_count]=res; //接收字符放入类型缓存
if(byte_count>=4)
{ //如果类型数据接收完毕,判断类型
if(cmd[0]=='G')
{
if(cmd[1]=='P')
{
if(cmd[2]=='R')
{
if(cmd[3]=='M')
{
if(cmd[4]=='C')
{
mod_cmd=1;
mod=2;
seg_count=0;
byte_count=0;
}
}
}
else if(cmd[2]=='G')
{
if(cmd[3]=='G')
{
if(cmd[4]=='A')
{
mod_cmd=2;
mod=2;
seg_count=0;
byte_count=0;
}
}
}
}
}
}
}
else if(mod==2)
{
switch (mod_cmd)
{
case 1:
gprmc_cmd();
break;
case 2:
gpgga_cmd();
break;
}
}
byte_count++; //接收数位加
break;
}
}
}
void gprmc_cmd(void)
{
switch(seg_count) //数逗号数(第seg_count个)
{
case 1:
if(byte_count<6)
time[byte_count]=res;//时间处理 UTC时间,hhmmss(时分秒)
break;
case 2://定位状态 定位是否有效 A=有效 V=无效
if(byte_count<1)
lock=res;
break;
case 3://纬度数据 纬度ddmmm.mmmmm(度分)
if(byte_count<9)
WD[byte_count]=res;
break;
case 4://纬度半球 N=北半球 S=南半球
if(byte_count<1)
WD_a=res;
break;
case 5://经度数据 经度dddmm.mmmmm(度分)
if(byte_count<10)
JD[byte_count]=res;
break;
case 6://经度半球 E=东经W=西经
if(byte_count<1)
JD_a=res;
break;
case 7://速度处理 地面速率(000.0~999.9)
if(byte_count<5)
speed[byte_count]=res;
break;
case 8://方位角处理 地面航向(000.0~359.9度,以正北方为参考基准)
if(byte_count<5)
angle[byte_count]=res;
break;
case 9:
if(byte_count<6)//时间处理 UTC日期,ddmmyy(日月年)
date[byte_count]=res;
break;
}
}
void gpgga_cmd(void)
{
switch(seg_count)
{
case 7: //定位使用的卫星数
if(byte_count<2)
use_sat[byte_count]=res;
break;
}
}
接收回来的数据都放数组里
int main(void)
{
Stm32_Clock_Init(9);// 系统时钟设置
Delay_Init(72); //延时初始化
Usart2_Init(36,38400);//串口2初始化38400
Portset();
SPIx_Init();
LCD_Init();
// SPI_Flash_Write(gImage_quantu,4273645+76800*0,76800);
delay_ms(300);
// BackGround_Pic(0,1);
if(Font_Init())//字库不存在,则更新字库
POINT_COLOR=MAGENTA;
POINT_COLOR=RED;
reginit();
// Show_Str(50,70, "无效",16,0);
// LCD_ShowBigChar(50,160,'A');
// Show_big_Font(60,100,0,60,0);
// Show_big_Font(120,100,1,60,0);
// Show_big_Font(180,100,2,60,0);
// Show_big_Font(180,100,3,60,0);
/* LCD_ShowChar(66,70,0x24,16,0); //$
LCD_ShowChar(74,70,0x2C,16,0); //,
LCD_ShowChar(82,70,0x2A,16,0); //
LCD_ShowChar(90,70,0x47,16,0); //G
LCD_ShowChar(98,70,0x50,16,0); //P
LCD_ShowChar(106,70,0x52,16,0); //R
LCD_ShowChar(114,70,0x4D,16,0); //M
LCD_ShowChar(122,70,0x43,16,0); */ //C
// LCD_ShowChar(130,70,0x0A,16,0);
while(1)
{
// BackGround_Pic(4,1);
// gprmc_cmd();
// BackGround_Pic(0,1);
if(ReceiveBit==1)
{
gps_disp();
}
if(ReceiveBit1==1)
{
gps_disp1();
}
}
}
void gps_disp1(void)
{
// u8 j;
// u8 cc,bb;
ReceiveBit1=0; //GPGGA接收完成标志位清零
BACK_COLOR=WHITE;
//POINT_COLOR=WHITE;
POINT_COLOR=RED;
//if(lock=='A')
//{
if(use_sat[0]==0x30) //使用卫星数
{
LCD_ShowString(2,53,200,16,16,"weixingshu:");
LCD_ShowChar(90,53,use_sat[1],16,0);
LCD_ShowChar(98,53,0x20,16,0);
}
else
{
LCD_ShowString(2,53,200,16,16,"weixingshu:");
LCD_ShowChar(90,53,use_sat[0],16,0);
LCD_ShowChar(98,53,use_sat[1],16,0);
}
//}
}
void gps_disp(void)
{
// u8 j;
// u8 cc,bb;
ReceiveBit=0; //GPRMC接收完成标志位清零
//ReceiveBit1=0; //GPGGA接收完成标志位清零
/* BACK_COLOR=WHITE;
//POINT_COLOR=WHITE;
POINT_COLOR=RED;
if(use_sat[0]==0x30) //使用卫星数
{
LCD_ShowString(2,53,200,16,16,"weixingshu:");
LCD_ShowChar(90,53,use_sat[1],16,0);
LCD_ShowChar(98,53,0x20,16,0);
}
else
{
LCD_ShowString(2,53,200,16,16,"weixingshu:");
LCD_ShowChar(90,53,use_sat[0],16,0);
LCD_ShowChar(98,53,use_sat[1],16,0);
}
*/
if(lock=='A') //定位状态 A有效定位 V无效定位
{
// Show_Str(50,70, "有效",16,0);
// LCD_ShowBigChar(50,160,'A');
POINT_COLOR=RED;
LCD_ShowString(2,70,200,16,16,"youxiaowei:");
LCD_ShowChar(90,70,0x41,16,0);
/* for(j=0;j<10;j++)
WD_bak[j]=WD[j];
for(j=0;j<11;j++)
JD_bak[j]=JD[j]; */
}
if(lock=='V')
{
POINT_COLOR=RED;
//Show_Str(50,70, "无效",16,0);
// LCD_ShowBigChar(50,160,'V');
LCD_ShowString(2,70,200,16,16,"wuxiaowei: ");
LCD_ShowChar(90,70,0x56,16,0);
}
// }
BACK_COLOR=BLACK;
POINT_COLOR=AUDIOCOLOUR;
//Show_Str(5,5, "时间",16,1);
/*计算东八区的时间*/
/* cc=time[0]-0x30;
bb=time[1]-0x30;
time_hour=cc*10+bb;
time_hour=time_hour+8;
if(time_hour>=24)
time_hour=time_hour-24;
timer.hour=time_hour;
timer.min=(time[2]-0x30)*10+time[3]-0x30;
timer.sec=(time[4]-0x30)*10+time[5]-0x30; */
// }
//LCD_ShowBigChar(50,160,timer.hour);
//LCD_ShowBigChar(100,160,24);
//显示时分秒00:00:00
LCD_ShowString(2,121,200,16,16,"UTCtime:");
LCD_ShowChar(66, 121, time[0], 16, 0);
LCD_ShowChar(74, 121, time[1], 16, 0);
LCD_ShowChar(82, 121, 0x3a, 16, 0);
LCD_ShowChar(90, 121, time[2], 16, 0);
LCD_ShowChar(98, 121, time[3], 16, 0);
LCD_ShowChar(106, 121, 0x3a, 16, 0);
LCD_ShowChar(114, 121, time[4], 16, 0);
LCD_ShowChar(122, 121, time[5], 16, 0);
//显示年月日00-00-00
LCD_ShowString(2,138,200,16,16,"UTCdate:");
LCD_ShowChar(66, 138, date[4], 16, 0);
LCD_ShowChar(74, 138, date[5], 16, 0);
LCD_ShowChar(82, 138, 0x2D, 16, 0);
LCD_ShowChar(90, 138, date[2], 16, 0);
LCD_ShowChar(98, 138, date[3], 16, 0);
LCD_ShowChar(106, 138, 0x2D, 16, 0);
LCD_ShowChar(114, 138, date[0], 16, 0);
LCD_ShowChar(122, 138, date[1], 16, 0);
//if(lock=='A') //定位状态 A有效定位 V无效定位
//{
//地面速率
LCD_ShowString(2,156,200,16,16,"speed:");
LCD_ShowChar(50, 156, speed[0], 16, 0);
LCD_ShowChar(58, 156, speed[1], 16, 0);
LCD_ShowChar(66, 156, speed[2], 16, 0);
LCD_ShowChar(74, 156, speed[3], 16, 0);
LCD_ShowChar(82, 156, speed[4], 16, 0);
if(JD_a==0x45) //经度方向0x45就是E
// LCD_ShowBigChar(5,104,'E');
//Show_Str(5,104, "东经:",16,1);
{//LCD_ShowString(26,104,200,16,16,"E:");
LCD_ShowChar(26,104,0x45,16,0); //E
LCD_ShowChar(34,104,0x20,16,0); //
LCD_ShowChar(42,104,0x3A,16,0); //:
}
else if(JD_a==0x57) //经度方向0x57就是W
// LCD_ShowBigChar(5,104,'W');
//Show_Str(5,104, "西经:",16,1);
{
// LCD_ShowString(26,104,200,16,16,"W:");
LCD_ShowChar(26,104,0x57,16,0); //W
LCD_ShowChar(34,104,0x20,16,0); //
LCD_ShowChar(42,104,0x3A,16,0); //:
}
else
// Show_Str(5,104, "经度:",16,1);
// LCD_ShowBigChar(5,104,'J');
{
LCD_ShowChar(26,104,0x4A,16,0); //J
LCD_ShowChar(34,104,0x44,16,0); //D
LCD_ShowChar(42,104,0x3A,16,0); //:
}
LCD_ShowChar(50,104,JD[0],16,0);
LCD_ShowChar(58,104,JD[1],16,0);
LCD_ShowChar(66,104,JD[2],16,0);
LCD_ShowString(74,104,200,16,16,"°");
//LCD_ShowChar(74,104,0xA7,16,0);
LCD_ShowChar(82,104,JD[3],16,0);
LCD_ShowChar(90,104,JD[4],16,0);
LCD_ShowChar(98,104,JD[5],16,0);
LCD_ShowChar(106,104,JD[6],16,0);
LCD_ShowChar(114,104,JD[7],16,0);
LCD_ShowChar(122,104,JD[8],16,0);
LCD_ShowChar(130,104,JD[9],16,0);
LCD_ShowChar(138,104,JD[10],16,0);
LCD_ShowChar(146,104,0x27,16,0);
if(WD_a==0x4E)
//Show_Str(5,87, "北纬:",16,1);
//LCD_ShowBigChar(5,87,'N');
{
//LCD_ShowString(26,87,200,16,16,"N:");
LCD_ShowChar(26,87,0x4E,16,0); //N
LCD_ShowChar(34,87,0x20,16,0); //
LCD_ShowChar(42,87,0x3A,16,0); //:
}
else if(WD_a==0x53)
//Show_Str(5,87, "南纬:",16,1);
//LCD_ShowBigChar(5,87,'S');
{
//LCD_ShowString(26,87,200,16,16,"S:");
LCD_ShowChar(26,87,0x53,16,0); //S
LCD_ShowChar(34,87,0x20,16,0); //
LCD_ShowChar(42,87,0x3A,16,0); //:
}
else
//Show_Str(5,87, "纬度:",16,1);
// LCD_ShowBigChar(5,160,'W');
{
LCD_ShowChar(26,87,0x57,16,0); //W
LCD_ShowChar(34,87,0x44,16,0); //D
LCD_ShowChar(42,87,0x3A,16,0);
}
LCD_ShowChar(50,87,WD[0],16,0);
LCD_ShowChar(58,87,WD[1],16,0);
LCD_ShowString(66,87,200,16,16,"°");
//LCD_ShowChar(66,87,0xA7,16,0);
LCD_ShowChar(74,87,WD[2],16,0);
LCD_ShowChar(82,87,WD[3],16,0);
LCD_ShowChar(90,87,WD[4],16,0);
LCD_ShowChar(98,87,WD[5],16,0);
LCD_ShowChar(106,87,WD[6],16,0);
LCD_ShowChar(114,87,WD[7],16,0);
LCD_ShowChar(122,87,WD[8],16,0);
LCD_ShowChar(130,87,WD[9],16,0);
LCD_ShowChar(138,87,0x27,16,0);
//}
}
然后把数组里的东西显示出来,应该是没问题的。。。 |
|