基于STM32的GPS模块驱动(AIR530)

2023-05-16

一、概述

         由于做项目要用到GPS定位,于是在某宝购买了这款GPS模块。项目采用的MCU是STM32。废话少说,进入正题。

二、GPS模块简介

        Air530 模块是一款高性能、高集成度的多模卫星定位导航模块。体积小、功耗低,可用于车载导 航、智能穿戴、无人机等 GNSS 定位的应用中。而且提供了和其他模块厂商兼容的软、硬件接口,大幅 减少了用户的开发周期。 模块支持GPS/Beidou/GLONASS/Galileo/QZSS/SBAS。采用了射频基带一体化设计,集成了 DC/DC、 LDO、 LNA、射频前端、基带处理、32 位 RISC CPU、RAM、FLASH 存储、RTC 和电源管理等功能。提供 超高的性能,即使在弱信号的地方,也能快速、准确的定位。

这个模块有五个引脚。如果只是简单的定位玩一下的话,那个1pps引脚不用也可以。

 VDD       供电电源,电压输入 范围 3.3V-5.5V

 TXD       GPS 串口数据输出, 2.8V--5V 自适应

RXD       GPS 串口数据输入, 2.8V--5V 自适应

1PPS      One plus per second(2.8V)

GND      接地

三、STM32驱动程序编写

 1.NMEA协议

       在编写驱动程序前一定要知道NMEA协议。NMEA是(National Marine Electronics Association )为海用电子设备制定的标准格式。NMEA缩写,同时也是数据传输标准工业协会,在这里,实际上应为NMEA 0183。它是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不等,通常以每秒间隔选择输出,最常用的格式为"GGA",它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等,其他的有速度,跟踪,日期等。NMEA实际上已成为所有的GPS接收机和最通用的数据输出格式,同时它也被用于与GPS接收机接口的大多数的软件包里。NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。

       AIR530 模块支持 NMEA 0183 V4.1 协议并兼容以前版本,关于 NMEA 0183 V4.1 的详细信息请参照 NMEA 0183 V4.1 官方文档。

        GGA:时间、位置、卫星数量

        GLL:经度、纬度、 UTC 时间

        GSA:GPS 接收机操作模式,定位使用的卫星,DOP 值,定位状态

        GSV:可见 GPS 卫星信息、仰角、方位角、信噪比

        RMC:时间、日期、位置、速度 VTG:地面速度信息

 2.驱动开发

gps头文件

/*****************************************************
消息 :$GPRMC,100646.000,A,3109.9704,N,12123.4219,E,0.257,335.62,291216,,,A*59
ID :            $GPRMC RMC                  协议头
UTC时间:         100646.000                  hhmmss.sss
状态:            A                           A=数据有效;V=数据无效
纬度 :           2109.9704                   ddmm.mmmm
N/S:              N                          N=北,S=南
经度:           11123.4219                   dddmm.mmmm
E/W :             E                          W=西,E=东
地面速度:        0.257                        Knot(节)
方位:           335.62                        度
日期            291216                        ddmmyy
磁变量           无
校验和           *59
<CR><LF>                                     消息结束
******************************************************/
#ifndef __GPS__H
#define __GPS__H
#include "sys.h"
#include "usart.h"
#include "stdint.h"
#include "string.h"
#include "stdlib.h"
//启动命令

#define  HotStart     "$PGKC030,1,1*2C\r\n"      //Gps系统热启动
#define  WarmStart    "$PGKC030,2,1*2F\r\n"      //Gps系统温启动
#define  ColdStart    "$PGKC030,3,1*2E\r\n"      //Gps系统冷启动
#define  ReColdStart  "$PGKC030,4,1*29\r\n"      //Gps系统重置冷启动

// 卫星定位模式设置
#define  SingleGps    "$PGKC115,1,0,0,0*2B\r\n"      //单 GPS
#define  GPSandBEIDOU   "$PGKC115,1,0,1,0*2A\r\n"      //GPS+BEIDOU
#define  GPSandGLONASS  "$PGKC115,1,1,0,0*2A\r\n"      //GPS+GLONASS

// 低功耗模式设置       
#define  LPsleep  "$PGKC051,1*36\r\n"    //  sleep 模式     
#define  LPstop   "$PGKC051,0*37\r\n"    //  stop 模式 

/******************************************
//配置输出 NMEA 消息的间隔(ms 单位)  
Arg1: 200-10000
******************************************/
#define  delay1sNMEA  "$PGKC101,1000*02\r\n" // 间隔1ms


/******************************************
//开启或关闭 QZSS NMEA格式输出  
Arg1: “0”,关闭
      “1”,开启
******************************************/
#define  OpenNMEA    "$PGKC113,1*31\r\n"
#define  CloseNMEA   "$PGKC113,0*30\r\n"


//设置 NMEA 输出波特率
#define  SetBps115200   "$PGKC147,115200*06\r\n"
//加速定位信息
#define  MoreFast   "$PGKC639,34.093145,108.542323,0,2019,05,04,02,43,54*05\r\n"

/*******************************************
设置 NMEA 语句输出使能
Arg1: GLL “0”,关闭; “1”,打开
Arg2: RMC “0”,关闭; “1”,打开
Arg3: VTG “0”,关闭; “1”,打开
Arg4: GGA “0”,关闭; “1”,打开
Arg5: GSA “0”,关闭; “1”,打开
Arg6: GSV “0”,关闭; “1”,打开
Arg7: GRS “0”,关闭; “1”,打开
Arg8: GST “0”,关闭; “1”,打开
Arg9~ Arg19: 保留
*******************************************/
#define  EnableRMC   "$PGKC242,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*36\r\n"


//擦除 flash 中的辅助定位数据
#define  DeleteFlash   "$PGKC040*2B\r\n"


//开启或关闭 SBAS 功能
#define  CloseSBAS   "$PGKC239,1*3A\r\n"//关闭SBAS 功能
#define  OpenSBAS   "$PGKC239,0*3B\r\n"//开启SBAS 功能

//RMC_DATA结构体
typedef struct RMC_DATA{
	char    time[12];  //UTC时间
	char    state[12]; //状态 
  char	  lat[12];  //纬度
	char    NS[2];    //N/S指示
	char    WE[2];     //W/E指示
	char	  lng[12];  //经度
	char    date[12];  //日期
}rmc_data;
//错误信息上传数据帧
typedef struct WARNING{
	char start;//帧头
	u8 WarningFlag;//从最低位到最高为分别表示:电池电量警告,GPS定位失败警告,电子围栏越界警告,跌倒警告,其他暂时预留。
	 char end;//结束标志
}Warning;
//定位信息上传数据帧
typedef struct OPSITIONDATA{
  char    start;
	char    time[12];  //UTC时间
	char    state[12]; //状态 
  char	  lat[12];  //纬度
	char    NS[2];    //N/S指示
	char	  lng[12];  //经度	
	char    WE[2];     //W/E指示
	char    date[12];  //日期
  char     end;
}OpsitionData;
//心率信息上传数据帧
typedef struct HEARTRATEDATA{
	char start;
  u8   HeartRate;//心率次数
	 char end;
}HeartRateData;

extern rmc_data  RecRMC; 
extern rmc_data * const pRecRMC; //RMC解析输出缓存区,该指针指向固定的地址
void SendAtToGps(u8 *cmd);
u8   GpsAckChack(u8 *str);
void Gps_Init(void);
void AnalysisRMC(rmc_data *pRecRMC);
void GpsRMCdataShow(void);
u8 OverStepArea(rmc_data *pRecRMC);
void mixGpsdate(char * ULdate,rmc_data *pRecRMC);
#endif

GPS驱动函数

#include "gps.h"
/*************************************
功能:发送数据到Gps模块
作者:贺远
日期:2019.03.05
参数:cmd  AT命令
返回值:无
**************************************/
void SendAtToGps(u8 *cmd)
{
	while(*cmd!='\0')
	{
	 USART_SendData(USART1,*cmd++);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==Bit_RESET);	//发送数据结束
	}
}
/*************************************
功能://检查GPS模块应答是否符合预期
作者:贺远
日期:2019.03.05
参数:str  正确的应答
返回值:无
**************************************/
u8 GpsAckChack(u8 *str)
{
		//u8 str[225];
	  delay_ms(500);
		if(USART1_RX_STA!=0)
		{
			 USART1_RX_STA=0;
			   
			 if(strstr((const char*)USART1_RX_BUF,(const char*)str)) { memset(USART1_RX_BUF,0, sizeof USART1_RX_BUF);        return 0;}//符合预期
			 else                                                    { memset(USART1_RX_BUF,0, sizeof USART1_RX_BUF);     return 1;}//不符合预期      
                                //清空数组  			
		} 
		else { memset(USART1_RX_BUF,0, sizeof USART1_RX_BUF);   return  1;}
}
/*************************************
功能:Gps模块初始化
作者:贺远
日期:2019.03.05
参数:无
返回值:无
**************************************/
void Gps_Init()
{
	cmd1:SendAtToGps(ColdStart);   //GPS冷启动
       delay_ms(50);	
	     if (!GpsAckChack("$PGKC001,30,3*1E"))  ; 
	     else goto  cmd1;
	cmd2:SendAtToGps(GPSandBEIDOU);//GPS+BEIDOU
       delay_ms(50);	
	     if (!GpsAckChack("$PGKC001,115,3,1,0,0,0,1,49*15"))  ; 
	     else goto  cmd2;

	cmd3:SendAtToGps(OpenSBAS);    //开启SBAS 功能
	     delay_ms(50);	
			 if (!GpsAckChack("$PGKC001,239,3*25"))  ; 
	     else goto  cmd3;
	cmd4:SendAtToGps(delay1sNMEA); //配置输出 NMEA 消息的间隔 1s
       delay_ms(50);	
	     if (!GpsAckChack("$PGKC001,101,3*2D"))  ; 
	     else goto  cmd4;
	cmd5:SendAtToGps(EnableRMC);   //设置 NMEA 语句输出使能  使能RMC
       delay_ms(50);	
	     if (!GpsAckChack("$PGKC001,242,3*29"))  ; 
	     else goto  cmd5;
       
			 SendAtToGps(MoreFast);//加速定位信息


}
rmc_data  RecRMC; 
rmc_data * const pRecRMC=&RecRMC; //RMC解析输出缓存区,该指针指向固定的地址
/*************************************
功能:GPSRMC数据解析
作者:贺远
日期:2019.03.09
参数:无
返回值:无
**************************************/
void AnalysisRMC(rmc_data *pRecRMC)//GPSRMC数据解析
{
	int i,n=0;
	if(USART1_RX_STA!=0)
		{
			 USART1_RX_STA=0;
			 for(i=0;USART1_RX_BUF[i]!='\0';i++)
			 {
				 if(USART1_RX_BUF[i]==',')  
				 {
					 n++;
					 i++;// 跳过 “,”
				 //strncpy(sub, string+12,13);   将string从string[12]开始,截取13个复制到sub中
				 if(n==1)  { strncpy(pRecRMC->time,  USART1_RX_BUF+i,10); 	i=i+9; }//i=i+10;目的是为了减少循环次数,提高效率
				 if(n==2)  { strncpy(pRecRMC->state, USART1_RX_BUF+i,1);           }
				 if(n==3)  { strncpy(pRecRMC->lat,   USART1_RX_BUF+i,9);    i=i+8; }  
				 if(n==4)  { strncpy(pRecRMC->NS,    USART1_RX_BUF+i,1); 				   }
				 if(n==5)  { strncpy(pRecRMC->lng,   USART1_RX_BUF+i,10);   i=i+9; }
				 if(n==6)  { strncpy(pRecRMC->WE,    USART1_RX_BUF+i,1);           }
				 if(n==9)  { strncpy(pRecRMC->date,  USART1_RX_BUF+i,6);    i=i+5; }
			  }
			 }
		 }
    memset(USART1_RX_BUF,0, sizeof USART1_RX_BUF);    //清空接收缓存区 			
	
	
}
/*************************************
功能:GPS解析数据显示
作者:贺远
日期:2019.03.09
参数:无
返回值:无
**************************************/

//void GpsRMCdataShow()

//{
//delay_ms(400);	
//		 AnalysisRMC(pRecRMC);
//		
//		 LCD_ShowString(10,70,250,16,16,"UTC  :");
//		 LCD_ShowString(60,70,250,16,16, (u8*)pRecRMC->time);
//		
//		 LCD_ShowString(10,90,250,16,16,"state:");
//		 LCD_ShowString(60,90,250,16,16,(u8*)pRecRMC->state);
//		
//		 LCD_ShowString(10,110,250,16,16,"lat  :");
//		 LCD_ShowString(60,110,250,16,16,(u8*)pRecRMC->lat);
//		 LCD_ShowString(150,110,250,16,16,(u8*)pRecRMC->NS);
//		
//		 LCD_ShowString(10,130,250,16,16,"lng  :");
//		 LCD_ShowString(60,130,250,16,16,(u8*)pRecRMC->lng);
//		 LCD_ShowString(150,130,250,16,16,(u8*)pRecRMC->WE);
//		
// 	   LCD_ShowString(10,150,250,16,16,"date :");
//	   LCD_ShowString(60,150,250,16,16,(u8*)pRecRMC->date);
//		 memset(pRecRMC,0, sizeof pRecRMC);    //清空接收缓存区 	
//}
/*************************************
功能:GPS电子围栏超出检测
作者:贺远
日期:2019.03.10
参数:无
返回值:0/1
**************************************/
u8 OverStepArea(rmc_data *pRecRMC)
{
	float a,b,c,a1=3415.2645,b1=10925.2235,c1;
	a=atof(pRecRMC->lat); //字符串转float
	b=atof(pRecRMC->lng);
	c=(a-a1)*(a-a1)+(b-b1)*(b-b1);
	c1=0.5555*0.5555+0.6666*0.6666;//圆形区域
  if(c1>=c) return 0;//未越界
	else return 1;
}
/*************************************
功能:GPS定位信息上传数据组帧
作者:贺远
日期:2019.03.10
参数:无
返回值:无
说明:char *strcat(char *dest, const char *src);
      strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;
      dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
**************************************/
void mixGpsdate(char * ULGpsdate,rmc_data *pRecRMC)
{
	ULGpsdate=strcat(ULGpsdate,pRecRMC->date);
	ULGpsdate=strcat(ULGpsdate,pRecRMC->time);
	ULGpsdate=strcat(ULGpsdate,pRecRMC->state);
	ULGpsdate=strcat(ULGpsdate,pRecRMC->lat);
	ULGpsdate=strcat(ULGpsdate,pRecRMC->NS);
	ULGpsdate=strcat(ULGpsdate,pRecRMC->lng);
	ULGpsdate=strcat(ULGpsdate,pRecRMC->WE);
	
}







 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32的GPS模块驱动(AIR530) 的相关文章

  • 根据 GPS 坐标计算 PNG 地图上的 X 和 Y 位置

    我正在 iPhone 应用程序上实现自定义地图 尺寸为 map width 和 map height 的图像 并尝试在该地图上显示当前用户位置 current long 和 current lat 我有 2 个参考点 具有已知的 GPS 坐
  • GPS 应用程序在 iOS 5 上停止工作 - 位置管理器未更新

    我开发了一个针对 iOS 4 3 的应用程序 效果很好 但自从我迁移到 iOS 5 0 以来 该应用程序开始表现出奇怪的行为 位置管理器不显示位置变化的更新 有人遇到过这种问题吗 谢谢你的帮助 我与 CLLocation 经理共享票价 出现
  • Android 将阿拉伯数字转换为英文数字

    我从 GPS 收到以下错误 Fatal Exception java lang NumberFormatException Invalid double 现在 这是我通过 Fabric 从用户处收到的错误 它看起来像阿拉伯语 所以我猜只有当
  • C#:GPS跟踪系统[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 C net 中构建带有移动设备 带 GPS 的 GPS 跟踪系统 场景是 通过支持 GPS 的手机跟踪用户 服务工程师 这里没
  • 如何测试GPS状态?

    我现在创建一个应用程序来通过 GPS 检测设备的位置 我对 GPS 状态有疑问 我查看 GpsStatus Listener 但它很复杂 因为我是 Android 新手 这是我尝试对 GPS 状态执行的操作 我是否走在正确的轨道上 fina
  • 如何确定当前用户位置是否在我的 MKCooperativeRegion 内?

    我有一个坐标区域 我已确定该区域包含我想要为我的应用程序显示的内容的限制 我已将其设置为具有中心点纬度 经度和跨度的 MKCooperativeRegion 如何确定当前 userLocation 是否在我的坐标区域内 使用地图矩形 这是使
  • 我如何从 JMapViewer 世界地图中获取鼠标单击位置

    我正在使用地图浏览器 http wiki openstreetmap org wiki JMapViewerjar 在 JPanel 上显示世界地图 在地图上我添加MapMarkerDot s这是 GPS 点 问题是当我单击MapMarke
  • GMSPolyline 非常大的内存峰值

    在允许用户在各种不同类型的地图上显示我们称之为轨迹的复杂位置点列表的 GPS 应用程序中 每个轨迹可以包含 2k 到 10k 个位置点 当轨迹在非 Google 地图类型上呈现时 它们会被大量剪切 修剪和路径简化 这是为了降低内存使用量并提
  • GPS 坐标(以度为单位)来计算距离

    在iPhone上 我以十进制度数获取用户的位置 例如 纬度39 470920和经度 0 373192 也就是A点 我需要用另一个 GPS 坐标 同样以十进制表示 B 点创建一条线 然后 计算从 A 到 B 的线与另一个点 C 之间的距离 垂
  • 如何通过 GPRS 向 GPS 追踪器(TK103、GT02、GT06、TK102 等)发送命令

    这已经被问过这里https stackoverflow com questions 25460743 gps tracker tk103 how to send message through server https stackoverf
  • 从 GPS 点绘制线

    我有大约 100 个 GPS 坐标列表 我想画出每个列表所构成的线 使用散点图绘制的列表之一 看起来有点像这样 显然那里有一条线 我尝试了几种方法来对 GPS 位置进行排序并绘制它们 lats lngs with open filename
  • Android 应用无法获取位置权限

    我的清单中有以下内容
  • C# - LINQ - GPS 纬度和经度的最短距离

    我有数据库 其中有带有 GPS 坐标的一流酒店 我想获得距离我选择的坐标最近的地方 我认为它应该看起来像这样 我在这里找到了很多示例代码 就像这样 var coord new GeoCoordinate latitude longitude
  • 在没有互联网的情况下使用 Javascript 获取 GPS 位置 [重复]

    这个问题在这里已经有答案了 您好 如果设备具有 GPS 硬件 我们可以在没有互联网连接的情况下使用 JavaScript 获取 GPS 位置吗 请注意谁将其标记为重复 我需要 JavaScript 在没有互联网连接的情况下工作 并使用 GP
  • 使用纬度/经度计算从 A 点到线段的距离

    我正在开发一个使用 GPS 的 Android 应用程序 我想知道如果 新位置 C 点 距离线段 AB 太远 是否有办法可以丢弃 GPS 位置数据 我正在使用发现的点到线段公式在维基百科上 http en wikipedia org wik
  • 如何从 Android 手机获取 GPS 数据?

    有没有办法将 Android 手机的 GPS 数据连接 USB 有线 到 PC 我目前正在使用基于 gpsd 项目的 GPSTether 应用程序 我正在寻找比该应用程序提供更多控制且错误更少的替代方案 另外 是否有另一种方法可以在不使用任
  • 如何知道jar文件是否已经在运行?

    经过谷歌研究后 我找到了很好的答案 例如 1 using jps or jps l让 jars 在 JVM 下运行 这个答案可以 但是如果用户根本没有安装java并且我使用例如 bat文件和带有java JRE的文件夹运行我的jar 另外
  • LocationManager requestLocationUpdates minTime OR minDistance

    我用的是安卓系统LocationManager及其方法requestLocationUpdates像这样 locationManager requestLocationUpdates LocationManager GPS PROVIDER
  • 谷歌地图定位是如何工作的?

    我的问题是谷歌地图或移动 GPS 如何找到我的当前位置 读完本文后我的高层次理解article http www physics org article questions asp id 55就是 GPS接收器通过这些卫星获取位置坐标 该位
  • Android 查找 GPS 位置一次,显示加载对话框

    我正在编写一个应用程序 它需要用户的当前位置 lastknownlocation 不会很有帮助 并显示从数据库中获取的所有最接近的 项目 的列表 我已经找到了最近的项目 效果很好 但暂时只使用硬编码的纬度和经度位置 但现在是时候实现查找实际

随机推荐

  • ROS 教程之 vision: 摄像头标定camera calibration

    在上一个ROS教程视觉文章中 xff0c 我们使用usb cam包读入并发布了图像消息 xff0c 但是图像没有被标定 xff0c 因此存在畸变 ROS官方提供了用于单目或者双目标定的camera calibration包 这个包是使用op
  • ROS 基础: 在同一个节点里订阅和发布消息

    在一些应用中 xff0c 可能有的人需要在同一个节点中实现订阅一个消息 xff0c 然后在该消息的回调函数中处理一下这些数据后再发布到另一个topic上 ROS answers中也有人有相同的疑问 xff0c 这里贴出Martin Peri
  • ROS : 修改ROS源代码(overlaying package)

    ROS官方或者其他个人提供了很多package供大家使用 xff0c 但是随着学习的深入 xff0c 很多人可能想去修改这些package的源代码 xff0c ROS提供了一种称之为overlaying的机制 它允许 ROS原有安装的pac
  • graph slam tutorial :从推导到应用3

    为了更好地理解graph based slam的过程 xff0c 本文以二维平面的激光SLAM为例子 xff0c 先简单介绍如何根据传感器信息构建图 xff0c 即图优化的前端 xff08 front end xff09 然后再针对上篇博客
  • graph slam tutorial : 从推导到应用1

    前言 SLAM问题的处理方法主要分为滤波和图优化两类 滤波的方法中常见的是扩展卡尔曼滤波 粒子滤波 信息滤波等 xff0c 熟悉滤波思想的同学应该容易知道这类SLAM问题是递增的 实时的处理数据并矫正机器人位姿 比如基于粒子滤波的SLAM的
  • graph slam tutorial :从推导到应用2

    在上一部分中通过一个例子大致了解了graph based slam的优化过程 在本篇博客中将提升一个层次 xff0c 对图优化的求解过程进行推导 由于博文关注的在图构建好以后 xff0c 如何调整机器人位姿使误差最下 因此 xff0c 本文
  • graph slam tutorial : g2o 的使用

    g2o全称general graph optimization xff0c 是一个用来优化非线性误差函数的c 43 43 框架 如果阅读了前几篇graph slam tutorial的博客 xff0c 再去读 g2o xff1a a gen
  • Monocular slam 的理论基础(1)

    前言 LSD SLAM和ORB SLAM的出现 xff0c 使得单目slam最近成为了研究热点 单目SLAM一般处理流程包括track和map两部分 所谓的track是用来估计相机的位姿 而map部分就是计算pixel的深度 xff0c 如
  • Monocular slam 中的理论基础(2)

    三角法求深度 xff08 triangulation xff09 在知道了相机的轨迹以后 xff0c 使用三角法就能计算某个点的深度 xff0c 在Hartley的 Multiple view Geometry 一书中第10章 第12章都是
  • svo: semi-direct visual odometry 论文解析

    SVO 从名字来看 xff0c 是半直接视觉里程计 xff0c 所谓半直接是指通过对图像中的特征点图像块进行直接匹配来获取相机位姿 xff0c 而不像直接匹配法那样对整个图像使用直接匹配 整幅图像的直接匹配法常见于RGBD传感器 xff0c
  • 想精通单片机开发,这些必备基础知识不可不掌握

    总体谈一谈对单片机学习的看法 1 我从不说51是基础 xff0c 如果我这么说 xff0c 也请把这句话理解为微机原理是基础 2 对51单片机的操作本质上就是对寄存器的操作 xff0c 对其他单片机也是如此 库只是一个接口 xff0c 方便
  • 从零开始手写 VIO

    前言 最近和高博合作推出了一个关于 VIO 的课程 xff0c 借此博客推荐下 这个课程的图优化后端是我们自己写的 xff0c 仅依赖 Eigen 实现后系统的精度和 ceres 以及 g2o 不相上下 个人感觉这个课程还是能学到不少东西
  • 如何用示波器测量串口波特率

    例如波特率为9600理解为 xff1a 单位时间内传输9600个码元 xff08 位 xff09 1s内可以传输9600位数 假如要测量波特率为9600 xff0c 则每一比特位的时间为 xff1a 1 9600 61 104us 一般示波
  • PHPstorm2018汉化方法

    PhpStorm 2018汉化包下载地址 xff1a https pan baidu com s 1sAPfpPrN3IvZSyGU2kFWmQ 8 将安装目录lib下的resources en jar文件删除 xff0c 然后将压缩包中的
  • CMake学习(3)—— 使用add_subdirectory()添加外部项目文件夹

    一般情况下 xff0c 我们的项目各个子项目都在一个总的项目根目录下 xff0c 但有的时候 xff0c 我们需要使用外部的文件夹 xff0c 怎么办呢 xff1f 例如 xff0c 在目录cxx utility example内的CMak
  • docker高级篇

    docker高级篇 一 dockerfile解析 1 dockerfile是什么 dockerfile是用来构建docker镜像的文本文件 xff0c 是有一条条构建镜像所需的指令和参数构成的脚本 2 dockerfile常用保留字指令 F
  • 死锁

    死锁 xff1a 死锁是指两个或两个以上的进程进在执行过程中 xff0c 由于资源竞争或由于相互通信而造成的一种阻塞式现象 xff0c 如果没有外力影响 那么它们将永远的持续下去 xff0c 此事称系统产生死锁现象 xff0c 这种永远互相
  • pygame入门教程-基础篇

    1 画布surface 我们先启动一个窗口 span class token keyword import span pygame pygame span class token punctuation span init span cla
  • LeetCode刷题(废弃)

    重要提示 xff1a 该博客不再更新 xff01 最新文章请参考LeetCode系列 xff01 为了更好地巩固算法知识 xff0c 打下扎实的计算机基础 好吧 xff0c 实在编不下去了 其实是闲着没事儿做 xff0c 不如动动脑 xff
  • 基于STM32的GPS模块驱动(AIR530)

    一 概述 由于做项目要用到GPS定位 xff0c 于是在某宝购买了这款GPS模块 项目采用的MCU是STM32 废话少说 xff0c 进入正题 二 GPS模块简介 Air530 模块是一款高性能 高集成度的多模卫星定位导航模块 体积小 功耗