|
发表于 2011-4-11 14:16:51
|
显示全部楼层
对了,楼主能把上位的波特率改成可设置的吗,我的GPS模块是9600的,单片机只有一个串口。。。不然只能重新初始化串口才能设置。
还有一个问题就是
/*
16进制位存储
0: 0xff无数据 手动'H'72',自动A'65
1~2: 月、日
3~5: 时、分、秒
6: 78北纬; 83南纬
7~10: 度、分整数、分小数1、分小数2
11: 69东经; 87西经
12~15: 度、分整数、分小数1、分小数2
*/
struct
{
INT8U state;
INT8U month;
INT8U day;
INT8U hour;
INT8U minute;
INT8U second;
INT8S NS;
INT32U Latitude;
INT8S EW;
INT32U Longitude;
}RecordData;
这里的坐标值和时间是否是BCD码表示的?
// 增加一条GPS记录
void Add_Record(void)
{
INT8U buf[8];
INT32U addr;
addr = RecordReg.str_addr + DATA_RECSIZE*RecordReg.rec_cnt; // 记录存储地址
RecordReg.rec_cnt++;
RecordData.state = 'H';
ASC2H(&RecordData.month, GPS_RMC_Data.UTCDate+2, 1);
ASC2H(&RecordData.day, GPS_RMC_Data.UTCDate, 1);
ASC2H(&RecordData.hour, GPS_RMC_Data.UTCTime, 1);
ASC2H(&RecordData.minute, GPS_RMC_Data.UTCTime+2, 1);
ASC2H(&RecordData.second, GPS_RMC_Data.UTCTime+4, 1);
RecordData.NS = GPS_RMC_Data.NS;
memcpy(buf, GPS_RMC_Data.Latitude, 4);
memcpy(buf+4, GPS_RMC_Data.Latitude + 5, 4);
ASC2H((INT8U *)&RecordData.Latitude, buf, 4);
//ASC2H((INT8U *)&RecordData.Latitude, GPS_RMC_Data.Latitude, 4);
RecordData.EW = GPS_RMC_Data.EW;
memcpy(buf+6, GPS_RMC_Data.Longitude, 2); // 先读度的取前2位 百位 十位
buf[0] = (buf[6]-0x30)*10 + (buf[7]-0x30) + 0x30; // 将前两个字节并成一个字符
//buf[1] = *(GPS_RMC_Data.Longitude+2); // 读取度的第3位/个位
memcpy(buf+1, GPS_RMC_Data.Longitude+2, 3);
memcpy(buf+4, GPS_RMC_Data.Longitude+6, 4);
ASC2H((INT8U *)&RecordData.Longitude, buf, 4);
//ASC2H((INT8U *)&RecordData.Longitude, GPS_RMC_Data.Longitude, 4);
Uart_SendData((INT8U *)&RecordData, sizeof(RecordData));
/*
Flash_Enable();
Flash_Write(...);
*/
}
这是我写的记录存储程序测试代码 |
|