• 嵌入式系统应用-拓展-GPRS或者北斗芯片定位


    1 定位系统选择

    因为项目需要,需要设计一个定位系统。可以自由切换北斗和GRPS的全球定位系统。

    综合对比之下,选择了中芯微的GM36的全球定位芯片。可以支持北斗和GPRS的定位系统。

    2 电路设计

    GM36采用了串口通讯,可以通过UART来获取数据。因为模块是每次主动发送的。 主控机只需要每次获取到合适的数据来解析就好。

    在这里插入图片描述

    这里需要注意的情况是:天线采用50ohm的阻抗进行匹配。
    所以尽量4层板子设计方案。

    3 通讯协议分析

    芯片采用两种协议:

    1、文本协议,包括 NMEA 标准协议
    2、CASBIN 二进制协议

    3.1 NMEA 标准协议格式

    NMEA(National Marine Electronics Association)是一个制定电子设备通信协议标准的组织,其最为知名的标准是NMEA 0183协议,用于海上和陆上的电子设备间的通信,特别是用于GPS设备和导航系统。下面是NMEA 0183标准协议的基本格式:

    1. 数据格式:NMEA 0183协议的数据以ASCII字符形式传输,每条数据以"$“符号开头,以换行符”\r\n"结束。
    2. 数据字段:每条NMEA 0183数据包含多个字段,字段之间使用逗号",“进行分隔。字段的数量和含义取决于具体的NMEA消息类型,常见的字段包括:消息起始符号:”$" 消息类型标识符:标识消息类型的三个字母,比如"GGA"表示定位数据。
    3. 数据字段:包含有关位置、时间、速度等信息的数据字段,字段顺序和含义由具体的消息类型确定 校验和:两个十六进制字符,表示校验和的结果

    在这里插入图片描述
    波特率一般默认采用9600

    譬如:$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

    1. "$"是消息起始符号
    2. "GPGGA"是消息类型标识符,表示该数据是GGA消息(定位数据)
    3. "123519"表示UTC时间
    4. "4807.038,N"表示纬度(48度07.038分北纬)
    5. "01131.000,E"表示经度(011度31.000分东经)
    6. 其他字段包括定位质量指示符、卫星数量、HDOP值、海拔高度、大地水准面高度等 "*47"是校验和。

    校验和计算:校验和是通过对消息中" " 与 " ∗ " 之间所有字符的异或运算得出的。例如,上述示例数据中的校验和 " ∗ 47 " 表示队 " "与"*"之间所有字符的异或运算得出的。例如,上述示例数据中的校验和"*47"表示队" """之间所有字符的异或运算得出的。例如,上述示例数据中的校验和"47"表示队"GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,"
    进行异或运算得到结果"47"

    3.2 RMC- 定位系统信息

    系统会自动上报各种定位系统信息,如果知识为了定位。可以采用RMC的定位系统信息

    在这里插入图片描述
    出了获取精度、维度和时间戳信息,基本够用了。
    数据是否正确,可以判断staus的值,如果值是’A’, 可以认为数据获取正确。

    定位系统要定位准确,要在空旷的地方,移动一下,才能解析到可靠的准确定位。

    3.3 中断接收代码

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    嘉立创EDA-PCB产品设计操作概要
    6_sleuth-zipkin-spring_boot_admin 链路追踪
    访问链表中的某个元素(快慢指针)
    2023年中国乳胶制品产量、需求量及市场规模分析[图]
    我修复了一个 Vite Bug,让我的项目首屏性能提高了 25%
    纺织企业如何选好网关实现数据采集和远程监控?
    Linux 命令(188)—— runlevel 命令
    Three.js 进阶之旅:物理效果-碰撞和声音 💥
    请问Java语言是否支持音频和视频播放、串口通信、截屏、录屏、底层协议等功能?
    Unity 场景优化策略
  • 原文地址:https://blog.csdn.net/huanghongqi11/article/details/138181919