STM32传感器系列:GPS定位模块
简介
我们在做一些项目的时候,可能需要使用到GPS模块,我们可以通过这个模块获得当前的位置以及时间,我这里就教大家如何去使用GPS定位模块,并且把示例代码开源到评论区下面,有需要自取即可,我我这里用到的是GPS NEO-6M模块搭配吸盘天线或者陶瓷天线。
实验所需材料
一块 STM32F103C8T6 小系统板、一个下载器、一个 4针 I2C 通讯的 OLED 液晶、一个GPS 驱动板、一套吸盘天线套装(吸盘天线可以搁置在窗户外无遮挡的地方)或陶瓷天线(陶瓷天线必须户外空旷地实验)、一个面包板、若干杜邦线。
实验步骤
1、通过 STLINK 下载器给小系统板烧录我开源的GPS示例代码。
2、拔掉小系统板上连接的 STLINK 杜邦线,用 4根杜邦线连接系统板和 OLED 液晶屏,用 4 根杜邦线连接系统板和 GPS 模块。
最小系统板和 OLED 液晶屏的接线方式:
VCC | 5V/3.3V |
GND | GND |
SCL | PB12 |
SDA | PB13 |
最小系统板和 GPS 模块的接线方式:
VCC | 5V |
GND | GND |
RX | PA2 |
TX | PA |
3、连接好后,用 USB 数据线给开发板上电
4、可以看到 OLED 液晶屏幕显示“爱学电子的刻刻帝”以及“模块同步中“。
5、等有信号后,GPS 模块上的 LED 灯会闪烁,获取到数据后,OLED 液晶屏幕上会显示 GPS 的经纬度以及时间会按北京时间走动。
模块介绍
引脚介绍
其中,PPS引脚同时连接到了模块自带了的状态指示灯:PPS,该引脚连接在UBLOX NEO-6M模组的TIMEPULSE端口,该端口的输出特性可以通过程序设置。PPS指示灯(即PPS引脚),在默认条件下(没经过程序设置),有2个状态:
1, 常亮,表示模块已开始工作,但还未实现定位。
2, 闪烁(100ms灭,900ms亮),表示模块已经定位成功。
指令解析
NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备
制定的标准格式。目前业已成了GPS导航设备统一的RTCM标准协议。NMEA-0183协议采用ASCII码来传递GPS定位信息,我们称之为帧。帧格式形如:$aaccc,ddd,ddd,…,ddd*hh(CR)(LF)
1、“$”:帧命令起始位
2、aaccc:地址域,前两位为识别符(aa),后三位为语句名(ccc)
3、ddd…ddd:数据
4、“*”:校验和前缀(也可以作为语句数据结束的标志)
5、hh:校验和(check sum),$与*之间所有字符ASCII码的校验和(各字节做异或运算,得到
校验和后,再转换16进制格式的ASCII字符)
6、(CR)(LF):帧结束,回车和换行符
UTC 时间即协调世界时,相当于本初子午线(0 度经线)上的时间,北京时间比 UTC 早 8 个小时。
指令讲解
1,$GPGGA(GPS定位信息,Global Positioning System Fix Data)
$GPGGA语句的基本格式如下(其中M指单位M,hh指校验和,CR和LF代表回车换行,下同):
$GPGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)
(1)UTC时间,格式为hhmmss.ss;
(2)纬度,格式为ddmm.mmmmm(度分格式);
(3)纬度半球,N或S(北纬或南纬);
(4)经度,格式为dddmm.mmmmm(度分格式);
(5)经度半球,E或W(东经或西经);
(6)GPS状态,0=未定位,1=非差分定位,2=差分定位;
(7)正在使用的用于定位的卫星数量(00~12)
(8)HDOP水平精确度因子(0.5~99.9)
(9)海拔高度(-9999.9到9999.9米)
(10)大地水准面高度(-9999.9到9999.9米)
(11)差分时间(从最近一次接收到差分信号开始的秒数,非差分定位,此项为空)
(12)差分参考基站标号(0000到1023,首位0也将传送,非差分定位,此项为空)
举例如下:
$GPGGA,023543.00,2308.28715,N,11322.09875,E,1,06,1.49,41.6,M,-5.3,M,,*7D
2,$GPGSA(当前卫星信息)
$GPGSA语句的基本格式如下:
$GPGSA,(1),(2),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(3),(4),(5),(6)*hh(CR)(LF)
(1) 模式,M = 手动,A = 自动。
(2) 定位类型,1=未定位,2=2D定位,3=3D定位。
(3) 正在用于定位的卫星号(01~32)
(4) PDOP综合位置精度因子(0.5-99.9)
(5) HDOP水平精度因子1(0.5-99.9)
(6) VDOP垂直精度因子(0.5-99.9)
举例如下:
$GPGSA,A,3,26,02,05,29,15,21,,,,,,,2.45,1.49,1.94*0E
注1:精度因子值越小,则准确度越高。
3,$GPGSV(可见卫星数,GPS Satellites in View)
$GPGSV语句的基本格式如下:
$GPGSV, (1),(2),(3),(4),(5),(6),(7),...,(4),(5),(6),(7)*hh(CR)(LF)
(1) GSV语句总数。
(2) 本句GSV的编号。
(3) 可见卫星的总数(00~12,前面的0也将被传输)。
(4) 卫星编号(01~32,前面的0也将被传输)。
(5) 卫星仰角(00~90度,前面的0也将被传输)。
(6) 卫星方位角(000~359度,前面的0也将被传输)
(7) 信噪比(00~99dB,没有跟踪到卫星时为空)。
注:每条GSV语句最多包括四颗卫星的信息,其他卫星的信息将在下一条$GPGSV语句中输出。
举例如下:
$GPGSV,3,1,12,02,39,117,25,04,02,127,,05,40,036,24,08,10,052,*7E
$GPGSV,3,2,12,09,35,133,,10,01,073,,15,72,240,22,18,05,274,*7B
$GPGSV,3,3,12,21,10,316,31,24,16,176,,26,65,035,42,29,46,277,18*7A
4,$GPRMC(推荐定位信息,Recommended Minimum Specific GPS/Transit Data)
$GPRMC语句的基本格式如下:
$GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
(1) UTC时间,hhmmss(时分秒)
(2) 定位状态,A=有效定位,V=无效定位
(3) 纬度ddmm.mmmmm(度分)
(4) 纬度半球N(北半球)或S(南半球)
(5) 经度dddmm.mmmmm(度分)
(6) 经度半球E(东经)或W(西经)
(7) 地面速率(000.0~999.9节)
(8) 地面航向(000.0~359.9度,以真北方为参考基准)
(9) UTC日期,ddmmyy(日月年)
(10)磁偏角(000.0~180.0度,前导位数不足则补0)
(11) 磁偏角方向,E(东)或W(西)
(12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
举例如下:
$GPRMC,023543.00,A,2308.28715,N,11322.09875,E,0.195,,240213,,,A*78
5,$GPVTG(地面速度信息,Track Made Good and Ground Speed)
$GPVTG语句的基本格式如下:
$GPVTG,(1),T,(2),M,(3),N,(4),K,(5)*hh(CR)(LF)
(1) 以真北为参考基准的地面航向(000~359度,前面的0也将被传输)
(2) 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输)
(3) 地面速率(000.0~999.9节,前面的0也将被传输)
(4) 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
(5) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
举例如下:
$GPVTG,,T,,M,0.195,N,0.361,K,A*2A
6,$GPGLL(定位地理信息,Geographic Position)
$GPGLL语句的基本格式如下:
$GPGLL,(1),(2),(3),(4),(5),(6),(7)*hh(CR)(LF)
(1) 纬度ddmm.mmmmm(度分)
(2) 纬度半球N(北半球)或S(南半球)
(3) 经度dddmm.mmmmm(度分)
(4) 经度半球E(东经)或W(西经)
(5) UTC时间:hhmmss(时分秒)
(6) 定位状态,A=有效定位,V=无效定位
(7) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
举例如下:
$GPGLL,2308.28715,N,11322.09875,E,023543.00,A,A*6A
7,$GPZDA(当前时间信息)
$GPZDA语句的基本格式如下:
$GPZDA,(1),(2),(3),(4),(5),(6)*hh(CR)(LF)
(1) UTC时间:hhmmss(时分秒)
(2) 日
(3) 月
(4) 年
(5) 本地区域小时(NEO-6M未用到,为00)
(6) 本地区域分钟(NEO-6M未用到,为00)
举例如下:
$GPZDA,082710.00,16,09,2002,00,00*64
NMEA-0183协议命令帧部分就介绍到这里,接下来我们看看NMEA-0183协议的校验,通过前面
的介绍,我们知道每一帧最后都有一个hh的校验和,该校验和是通过计算$与*之间所有字符
ASCII码的异或运算得到,将得到的结果以ASCII字符表示就是该校验(hh)。
例如语句:$GPZDA,082710.00,16,09,2002,00,00*64,校验和(红色部分参与计算)计算方法为:
0X47xor 0X50xor 0X5Axor 0X44xor 0X41xor 0X2Cxor 0X30xor 0X38xor 0X32xor 0X37xor
0X31xor 0X30xor 0X2Exor 0X30xor 0X30xor 0X2Cxor 0X31xor 0X36xor 0X2Cxor 0X30xor
0X39xor 0X2Cxor 0X32xor 0X30xor 0X30xor 0X32xor 0X2Cxor 0X30xor 0X30xor 0X2Cxor
0X30xor 0X30
得到的结果就是0X64,用ASCII表示就是64。
NMEA-0183协议我们就介绍到这里,了解了该协议,我们就可以编写单片机代码,解析
NMEA-0183数据,从而得到GPS定位的各种信息了。
程序设计
串口初始化程序
这里我们用到了串口2,我们初始化串口2。
void USART_Config_Init(void)
{USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 38400;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART2, &USART_InitStructure);/* Enable USARTy Receive interrupts */USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);//使能空闲中断/* Enable the USART2 */USART_Cmd(USART2, ENABLE);delay_ms(10);//等待10ms
}
串口2接收中断回调函数
void USART2_IRQHandler(void)
{uint8_t temp;if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET){ //防止溢出中断USART_ReceiveData(USART2); } if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){ //USART接收中断temp = USART_ReceiveData(USART2);if(rx_index > RXBUFF_SIZE){ //溢出不再接收数据return;}aRxBuffer[rx_index++] = temp;}if(USART_GetFlagStatus(USART2, USART_FLAG_IDLE) != RESET){ //USART空闲中断USART_ReceiveData(USART2);RX_len=rx_index;memcpy(USART2_RX_BUF,aRxBuffer,RX_len);//把缓冲区的数据,放入需要解析的数组rx_index=0;}}
GPS模块初始化
//配置UBLOX NEO-6的更新速率
//measrate:测量时间间隔,单位为ms,最少不能小于200ms(5Hz)
//reftime:参考时间,0=UTC Time;1=GPS Time(一般设置为1)
//返回值:0,发送成功;其他,发送失败.
uint8_t Ublox_Cfg_Rate(uint16_t measrate,uint8_t reftime)
{_ublox_cfg_rate *cfg_rate=(_ublox_cfg_rate *)USART2_TX_BUF;if(measrate<200)return 1; //小于200ms,直接退出cfg_rate->header=0X62B5; //cfg headercfg_rate->id=0X0806; //cfg rate idcfg_rate->dlength=6; //数据区长度为6个字节.cfg_rate->measrate=measrate;//脉冲间隔,uscfg_rate->navrate=1; //导航速率(周期),固定为1cfg_rate->timeref=reftime; //参考时间为GPS时间Ublox_CheckSum((uint8_t*)(&cfg_rate->id),sizeof(_ublox_cfg_rate)-4,&cfg_rate->cka,&cfg_rate->ckb);HAL_UART_Transmit(USART2, (uint8_t *)&USART2_TX_BUF, sizeof(_ublox_cfg_rate));return Ublox_Cfg_Ack_Check();
}
解析GPS接收到的信息
//NMEA 0183 协议解析后数据存放结构体
__packed typedef struct
{ uint8_t svnum; //可见卫星数nmea_slmsg slmsg[12]; //最多12颗卫星nmea_utc_time utc; //UTC时间uint32_t latitude; //纬度 分扩大100000倍,实际要除以100000uint8_t nshemi; //北纬/南纬,N:北纬;S:南纬 uint32_t longitude; //经度 分扩大100000倍,实际要除以100000uint8_t ewhemi; //东经/西经,E:东经;W:西经uint8_t gpssta; //GPS状态:0,未定位;1,非差分定位;2,差分定位;6,正在估算. uint8_t posslnum; //用于定位的卫星数,0~12.uint8_t possl[12]; //用于定位的卫星编号uint8_t fixmode; //定位类型:1,没有定位;2,2D定位;3,3D定位uint16_t pdop; //位置精度因子 0~500,对应实际值0~50.0uint16_t hdop; //水平精度因子 0~500,对应实际值0~50.0uint16_t vdop; //垂直精度因子 0~500,对应实际值0~50.0 int altitude; //海拔高度,放大了10倍,实际除以10.单位:0.1m uint16_t speed; //地面速率,放大了1000倍,实际除以10.单位:0.001公里/小时
}nmea_msg; //提取NMEA-0183信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void GPS_Analysis(nmea_msg *gpsx,uint8_t *buf)
{NMEA_GPGSV_Analysis(gpsx,buf); //GPGSV解析NMEA_GPGGA_Analysis(gpsx,buf); //GPGGA解析 NMEA_GPGSA_Analysis(gpsx,buf); //GPGSA解析NMEA_GPRMC_Analysis(gpsx,buf); //GPRMC解析NMEA_GPVTG_Analysis(gpsx,buf); //GPVTG解析
}
显示GPS解析到的数据
//显示GPS定位信息
void Gps_Msg_Show(void)
{float tp; tp=gpsx.longitude; sprintf((char *)dtbuf,":%.5f %1c",tp/=100000,gpsx.ewhemi); //得到经度字符串OLED_ShowF16x16(2,1,13);//经OLED_ShowF16x16(2,3,14);//度OLED_ShowString(2,5,(char *)dtbuf);tp=gpsx.latitude; sprintf((char *)dtbuf,":%.5f %1c",tp/=100000,gpsx.nshemi); //得到纬度字符串OLED_ShowF16x16(3,1,15);//纬OLED_ShowF16x16(3,3,16);//度OLED_ShowString(3,5,(char *)dtbuf); if(gpsx.fixmode<=3) //定位状态{ gpsx.utc.hour = gpsx.utc.hour + 8; //已知的UTC时间,转换成北京时间,差8小时if(gpsx.utc.hour>=24){gpsx.utc.hour-=24;}sprintf((char *)dtbuf,":%02d:%02d:%02d",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec); //显示北京时间OLED_ShowF16x16(4,1,17);//时OLED_ShowF16x16(4,3,18);//间OLED_ShowString(4,5,(char *)dtbuf); }}
完整的工程代码
通过网盘分享的文件:实时显示当前位置GPS信息.zip
链接: https://pan.baidu.com/s/1rIcEV_G6ukU4uVn44VBgMA?pwd=grtu 提取码: grtu
相关文章:

STM32传感器系列:GPS定位模块
简介 我们在做一些项目的时候,可能需要使用到GPS模块,我们可以通过这个模块获得当前的位置以及时间,我这里就教大家如何去使用GPS定位模块,并且把示例代码开源到评论区下面,有需要自取即可,我我这里用到的…...

技术成长战略是什么?
文章目录 技术成长战略是什么?1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结 3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议 技术成长战略是什么? 1. 前言 在波波的微信技术交流群里头…...

【前端】Vue3与Element Plus结合使用的超详细教程:从入门到精通
文章目录 Moss前沿AI一、教程概述1.1 目标读者1.2 学习目标 二、为什么选择Vue3与Element Plus2.1 Vue3的优势2.2 Element Plus的优势2.3 二者结合的优势 三、环境搭建3.1 创建Vue3项目3.2 安装Element Plus3.3 引入Element Plus 四、Element Plus常用组件使用详解4.1 按钮&…...

Linux 35.6 + JetPack v5.1.4之 pytorch升级
Linux 35.6 JetPack v5.1.4之 pytorch升级 1. 源由2. 升级步骤1:获取二进制版本步骤2:安装二进制版本步骤3:获取torchvision步骤4:安装torchvision步骤5:检查安装版本 3. 使用4. 补充4.1 torchvision版本问题4.2 支持…...
旷视科技C++面试题及参考答案
在 Linux 系统下常用的命令有哪些? 在 Linux 系统中有许多常用命令。首先是文件和目录操作相关的命令。“ls” 命令用于列出目录的内容,它有很多选项,比如 “ls -l” 可以以长格式显示文件和目录的详细信息,包括文件权限、所有者、大小、修改时间等;“ls -a” 则会显示所有…...
C 语言函数指针 (Pointers to Functions, Function Pointers)
C 语言函数指针 {Pointers to Functions, Function Pointers} 1. Pointers to Functions (函数指针)2. Function Pointers (函数指针)2.1. Declaring Function Pointers2.2. Assigning Function Pointers2.3. Calling Function Pointers 3. Jump Tables (转移表)References 1. …...

66.基于SpringBoot + Vue实现的前后端分离-律师事务所案件管理系统(项目 + 论文)
项目介绍 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装律师事务所案件管理系统软件来发挥其高效地信息处理的作用…...
Docker容器中Elasticsearch内存不足问题排查与解决方案
在使用Docker运行Elasticsearch(ES)时,可能会遇到内存不足的问题,导致ES无法启动。以下是一次完整的排查和解决过程。 问题描述 在启动ES时,日志提示如下错误: # Native memory allocation (mmap) failed…...

Ubuntu 下测试 NVME SSD 的读写速度
在 Ubuntu 系统下,测试 NVME SSD 的读写速度,有好多种方法,常用的有如下几种: 1. Gnome-disks Gnome-disks(也称为“Disks”)是 GNOME 桌面环境中的磁盘管理工具,有图形界面,是测试…...
Neo4j的部署和操作
注:本博文展示部署哥操作步骤和命令,具体报告及运行截图可通过上方免费资源绑定下载 一.数据库的部署与配置 在单个节点上对进行数据库的单机部署 (1)上传neo4j-community-3.5.30-unix.tar.gz到hadoop1的/export/so…...
react axios 优化示例
使用 axios 是 React 项目中非常常见的 HTTP 请求库。为了提升 axios 在 React 中的性能、可维护性和用户体验,我们可以从 代码组织、请求优化 和 用户体验优化 多个角度进行详细的优化。 一、安装与基础配置 安装 axios npm install axios创建 Axios 实例 为了更好地管理…...

探索数字化展馆:开启科技与文化的奇幻之旅
在科技飞速发展的当下,数字展馆作为一种新兴的展示形式,正逐渐走进大众的视野。数字展馆不仅仅是传统展馆的简单“数字化升级”,更是融合了多媒体、数字化技术以及人机交互等前沿科技的创新产物。 数字展馆借助VR、AR、全息投影等高科技手段&…...

基于深度学习的视觉检测小项目(七) 开始组态界面
开始设计和组态画面。 • 关于背景和配色 在组态画面之前,先要确定好画面的风格和色系。如果有前端经验和美术功底,可以建立自己的配色体系。像我这种工科男,就只能从网络上下载一些别人做好的优秀界面,然后在photo shop中抠取色…...

AI赋能跨境电商:魔珐科技3D数字人破解出海痛点
跨境出海进入狂飙时代,AI应用正在深度渗透并重塑着跨境电商产业链的每一个环节,迎来了发展的高光时刻。生成式AI时代的大幕拉开,AI工具快速迭代,为跨境电商行业的突破与飞跃带来了无限可能性。 由于跨境电商业务自身特性鲜明&…...
【C/C++】nlohmann::json从文件读取json,并进行解析打印,实例DEMO
使用 json::parse 函数将JSON格式的字符串解析为 nlohmann::json 对象。这个函数支持多种输入源,包括字符串、文件流等。 #include <iostream> #include <nlohmann/json.hpp> #include <fstream>using json nlohmann::json;int main() {// 解析…...

安装Anaconda搭建Python环境,并使用VSCode作为IDE运行Python脚本
下面详细说明如何安装Anaconda搭建Python环境,并使用VSCode作为编辑器运行Python脚本的过程: 1. 下载Anaconda 访问Anaconda的官方网站:https://www.anaconda.com/products/distribution 3. 根据您的操作系统选择适合的版本下载。Anaconda支…...
我用AI学Android Jetpack Compose之入门篇(1)
这篇我们先来跑通第一个Android Jetpack Compose工程,现在新版本的Android Studio,新建工程选择Empty Activity默认就会开启Jetpack Compose的支持,再次声明,答案来自 通义千问Ai 文章目录 1.用Android Jetpack Compose需要安装什…...
使用 Docker 查看 Elasticsearch 错误日志
在使用 Elasticsearch(简称 ES)的过程中,我们可能会遇到各种问题。为了快速定位和解决这些问题,查看错误日志是关键。本文将介绍如何使用 Docker 查看 Elasticsearch 的错误日志,并提供一些实用技巧。 1. 安装 Docker…...

使用Apache Mahout制作 推荐引擎
目录 创建工程 基本概念 关键概念 基于用户与基于项目的分析 计算相似度的方法 协同过滤 基于内容的过滤 混合方法 创建一个推荐引擎 图书评分数据集 加载数据 从文件加载数据 从数据库加载数据 内存数据库 协同过滤 基于用户的过滤 基于项目的过滤 添加自定…...

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询
作者:来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布,它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...