因为项目需要,需要设计一个定位系统。可以自由切换北斗和GRPS的全球定位系统。
综合对比之下,选择了中芯微的GM36的全球定位芯片。可以支持北斗和GPRS的定位系统。
GM36采用了串口通讯,可以通过UART来获取数据。因为模块是每次主动发送的。 主控机只需要每次获取到合适的数据来解析就好。
这里需要注意的情况是:天线采用50ohm的阻抗进行匹配。
所以尽量4层板子设计方案。
芯片采用两种协议:
1、文本协议,包括 NMEA 标准协议
2、CASBIN 二进制协议
NMEA(National Marine Electronics Association)是一个制定电子设备通信协议标准的组织,其最为知名的标准是NMEA 0183协议,用于海上和陆上的电子设备间的通信,特别是用于GPS设备和导航系统。下面是NMEA 0183标准协议的基本格式:
波特率一般默认采用9600
譬如:$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
校验和计算:校验和是通过对消息中"
"
与
"
∗
"
之间所有字符的异或运算得出的。例如,上述示例数据中的校验和
"
∗
47
"
表示队
"
"与"*"之间所有字符的异或运算得出的。例如,上述示例数据中的校验和"*47"表示队"
"与"∗"之间所有字符的异或运算得出的。例如,上述示例数据中的校验和"∗47"表示队"GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,"
进行异或运算得到结果"47"
系统会自动上报各种定位系统信息,如果知识为了定位。可以采用RMC的定位系统信息
出了获取精度、维度和时间戳信息,基本够用了。
数据是否正确,可以判断staus的值,如果值是’A’, 可以认为数据获取正确。
定位系统要定位准确,要在空旷的地方,移动一下,才能解析到可靠的准确定位。
void USART1_IRQHandler(void)
{
rt_interrupt_enter();
u8 Res;
if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE))
{
Res=usart_data_receive(USART1);
if(Res == '$') // 检测起始字符
{
cnt = 0;
}
else
{
rec_buff[cnt++] = Res;
if(rec_buff[0] == '$' && rec_buff[4] == 'M' && rec_buff[5] == 'C') //确定是否收到"GPRMC/GNRMC"这一帧数据
{
if(Res == '\n') // 停止接收,发送信号量,通知线程可以处理数据
{
usart_disable(USART1); // 关闭传输
rt_sem_release(&beidou_sem); // 释放信号量,开始处理数据
}
}
}
usart_interrupt_flag_clear(USART1,USART_INT_FLAG_RBNE); // 清除标志位
}
// else if(RESET != usart_interrupt_flag_get(USART2, USART_INT_FLAG_IDLE))
// {
// usart_data_receive(USART2);
// rec_buff[cnt++]='\0';
rt_sem_release(&tm18_sem);
// }
else
__nop();
rt_interrupt_leave();
}