STM32 GPS例程:NMEA协议解析与DMA串口接收实现
简介面向STM32嵌入式开发者这份资源提供了基于STM32CubeMX的GPS模块开发完整例程适合希望掌握CUBE配置工具并结合实际外设应用的初中级学习者。工程以STM32F103ZET6为主控演示了时钟设定为72MHz、UART参数配置、接收中断开启以及NMEA报文解析等关键环节涵盖从芯片初始化到应用层数据处理的完整链路。包体共188个文件压缩后约8.58MB包含HAL库驱动、C源文件、头文件、ioc工程文件及Keil MDK项目文件目录层次清晰便于对照学习和二次开发。已有220人学习下载对于想快速入门STM32CubeMX和GPS数据解析的开发者是一份可直接运行并带有详细配置说明的实用参考资料。1. GPS 例程跑通容易解析才是分水岭STM32 的 GPS 例程很多人以为串口能打印出 $GPRMC 就算成功。实际上那只是模块自证活着距离能用还差着十万八千里。真正花时间的是 NMEA 协议解析、坐标系换算、以及没锁星时数据怎么处理。这份基于 STM32F103ZET6 和 STM32CubeMX 的 GPS 例程价值不在于能收到数据——大多数 GPS 模块上电就能吐数据——而在于它把串口配置、DMA 接收、状态机解析整条链路都打通了让你拿到就能往自己的板子上移植。适合理清需求再动手的开发者新手照着它能避开一堆串口玄学问题熟手可以拿它的解析框架直接改协议、加功能不用从零造轮子。看完这篇你能确认自己拿到的是不是那份值得抄的例程也能知道抄的时候要在哪几处留个心眼。2. CubeMX 里先立住串口和时钟配置不是一路 Next 就完事2.1 时钟树ZET6 的 72MHz 没那么自动STM32F103ZET6 属于高容量产品外部晶振常见 8MHz也有用 25MHz 的板子。CubeMX 里选好芯片后默认是没有帮你配好时钟树的很多人直接跳过了 RCC 配置导致后面串口波特率偏得离谱。我一般这样配RCC 里把 HSE 设为 Crystal/Ceramic Resonator然后在 Clock Configuration 里把 PLL 倍频到 72MHz。注意 APB1 总线频率要设成 36MHz因为 USART 挂在 APB1 上USART1 在 APB2USART2/3 在 APB1这个总线频率直接决定你配置波特率时用的外设时钟值。/* CubeMX生成的时钟配置关键参数如下 */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; /* HSE 8MHzPLL倍频到72MHz */ RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_ON; /* 开启HSE */ RCC_OscInitStruct.HSEPredivValue RCC_HSE_PREDIV_DIV1; /* 不分频 */ RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE; /* HSE作为PLL输入 */ RCC_OscInitStruct.PLL.PLLMUL RCC_PLL_MUL9; /* 8MHz x9 72MHz */ if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1; /* HCLK 72MHz */ RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2; /* APB1 36MHzUSART2/3在这里 */ RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1; /* APB2 72MHzUSART1在这里 */ if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2) ! HAL_OK) { Error_Handler(); } }PLLMUL 设 9 倍的前提是 HSE 必须是 8MHz。如果你的板子焊的是 25MHz 晶振这里就得改成 72/25 的非整数倍根本配不出来。遇到这种情况我建议先看板子原理图确认晶振而不是乱调倍频系数。很多 GPS 例程串口全是乱码就是这么来的——时钟没配上波特率全是歪的。2.2 USART 选哪个、参数怎么设不是随便拉一个串口GPS 模块通常 3.3V 供电、TTL 电平输出默认波特率常见 9600 或 115200看模块手册ATGM336H 默认 9600NEO-M8N 默认 9600。例程里用的是 USART3挂在 APB1 总线上这点本身没毛病但波特率参数必须和你手里的模块一致。/* USART3初始化9600bps8位数据无校验1位停止位 */ static void MX_USART3_UART_Init(void) { huart3.Instance USART3; huart3.Init.BaudRate 9600; /* 模块默认波特率 */ huart3.Init.WordLength UART_WORDLENGTH_8B; huart3.Init.StopBits UART_STOPBITS_1; huart3.Init.Parity UART_PARITY_NONE; huart3.Init.Mode UART_MODE_TX_RX; huart3.Init.HwFlowCtl UART_HWCONTROL_NONE; huart3.Init.OverSampling UART_OVERSAMPLING_16; if (HAL_UART_Init(huart3) ! HAL_OK) { Error_Handler(); } }旁边那个 OverSampling 参数默认 16 倍采样就够了不用动。除非你用非常规晶振导致波特率误差偏大才需要切到 8 倍采样去换一点容错空间——但那种情况我建议先查时钟树别拿过采样当后悔药。还有一点GPS 模块的 TX 接 STM32 的 RXRX 接 TX共地。板子上如果标注反了你收到的就是乱码这点最容易翻车。2.3 CubeMX 生成工程后必须手改的三处CubeMX 生成的代码只是骨架GPS 例程要在三个地方手动补东西一是串口接收要换成 DMA 循环模式二是使能 UART IDLE 中断空闲中断三是把中断优先级调低——因为 GPS 数据是一帧一帧来的每帧 80 字节左右优先级太高会抢掉其他实时任务的执行时间。/* main.c中HAL_UART_Init之后手动添加 */ __HAL_UART_ENABLE_IT(huart3, UART_IT_IDLE); /* 使能空闲中断 */ /* DMA接收配置循环模式缓冲区按最大帧长预留 */ uint8_t gps_dma_buffer[128]; HAL_UART_Receive_DMA(huart3, gps_dma_buffer, 128);启用 IDLE 中断后每次 GPS 模块吐完一整帧帧间有几十毫秒空闲串口就会触发一次空闲中断这时候去把 DMA 缓冲区里的数据取走解析。比起逐字节中断接收这种方式省 CPU也不丢数据。我习惯把 DMA 缓冲区开成 128 字节——NMEA 最长的一帧 $GPGSV 可能到 100 字节出头短了会截断。另外在 stm32f1xx_it.c 里要补 USART3 的中断服务函数把 DMA 传输完成中断和空闲中断分开处理DMA 传输完成说明缓冲区满了数据还在持续来空闲中断才说明一帧结束了。这两个标志位处理不好数据会被拆成两半。3. NMEA 协议$GPRMC 每个字段都是什么意思3.1 帧格式与字段表别只会找逗号GPS 模块输出的 NMEA 0183 协议最常用的是 $GPRMC推荐最小定位信息和 $GPGGA定位信息。例程里主解析的是 $GPRMC因为它一行包含时间、经纬度、速度、航向、日期全部关键信息。$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50按逗号切分后各字段含义如下字段位置示例值含义说明1024813.640UTC时间格式 hhmmss.sss2A定位状态A有效定位V无效33158.4608纬度格式 ddmm.mmmm4N南北纬N/S511848.3737经度格式 dddmm.mmmm6E东西经E/W710.05速度单位为节8324.27航向单位度9150706日期格式 ddmmyy10空磁偏角通常为空11空磁偏角方向通常为空12A校验模式A自动重点是字段 3 和字段 5。NMEA 协议里经纬度是度分格式纬度 3158.4608 意思是 31 度 58.4608 分不是31.584608 度。这个不转换你拿到地图上直接偏出去几十公里属于最常见的误用。3.2 状态机解析比 strtok 靠谱的写法C 语言里做字符串分割新手第一反应是 strtok但这函数会破坏原字符串而且 GPS 数据是流式的、断断续续到达的。例程用的是逐字节状态机每个字符进来都判断当前状态遇到逗号切换字段遇到帧尾算结束。/* GPS解析状态机核心代码 */ typedef enum { GPS_WAIT_HEAD, /* 等待 $ 符号 */ GPS_WAIT_TYPE, /* 等待 RMC 类型 */ GPS_PARSE_FIELDS, /* 解析字段 */ GPS_CHECK_END /* 校验结束 */ } gps_parse_state_t; uint8_t gps_parse_char(uint8_t c, gps_data_t *data) { static gps_parse_state_t state GPS_WAIT_HEAD; static uint8_t field_index 0; static uint8_t field_buf[16]; static uint8_t field_pos 0; switch (state) { case GPS_WAIT_HEAD: if (c $) { state GPS_WAIT_TYPE; field_index 0; } break; case GPS_WAIT_TYPE: /* 这里判断帧类型比如 RMC */ if (c ,) { state GPS_PARSE_FIELDS; field_index 0; } break; case GPS_PARSE_FIELDS: if (c ,) { /* 一个字段收完按索引存值 */ field_buf[field_pos] \0; gps_store_field(data, field_index, field_buf); field_index; field_pos 0; } else if (c *) { /* 帧体结束进入校验 */ field_buf[field_pos] \0; gps_store_field(data, field_index, field_buf); state GPS_CHECK_END; } else if (field_pos sizeof(field_buf) - 1) { field_buf[field_pos] c; } break; case GPS_CHECK_END: state GPS_WAIT_HEAD; return 1; /* 一帧完整解析完成 */ } return 0; }这种逐字节解析的好处是数据来一个字节处理一个字节不依赖整帧缓冲区也不怕数据被 HAL 库拆成两段送过来。gps_store_field 函数里再按字段索引分别存时间、经纬度、速度、状态。如果你在主循环里直接拿 HAL_UART_Receive 等一整帧波特率低的时候 CPU 就干等着了。3.3 经纬度转换ddmm.mmmm 到十进制的坑拿到 3158.4608 这个原始值后要转成地图能认的十进制纬度度 31分 58.4608十进制 31 58.4608 / 60 31.974346。经度同理但经度的度是三位数11848.3737度118分48.3737。/* NMEA经纬度转十进制 */ float gps_convert_nmea_to_decimal(float nmea_coord, char direction) { int degrees (int)(nmea_coord / 100); /* 取整百得到度 */ float minutes nmea_coord - degrees * 100; /* 剩余是分 */ float decimal degrees minutes / 60.0f; if (direction S || direction W) { decimal -decimal; /* 南纬西经为负 */ } return decimal; }浮点数运算在 F103 上不算快但每秒只解析几帧 GPS 数据完全够用。这里有个精度问题float 只有 6 位有效数字经纬度转出来后小数点后第 5、6 位会有抖动。如果你做的是需要厘米级定位的差分场景建议直接用 double 类型存经纬度代价是内存多了 4 字节换来的是不丢精度。我一般习惯在结构体里直接定义 double 变量。4. 主循环里的事接收、解析、掉线处理一条龙4.1 DMA 双缓冲区还是单缓冲区轮换串口 DMA 循环模式下数据是不断往缓冲区里写的。如果单缓冲区持续接收解析的时候数据可能被新数据覆盖。常见做法是开两个缓冲区DMA 配置成双缓冲模式STM32 的 DMA 支持 memory-to-memory 双缓冲但 USART 的 DMA 需要手动切换目标地址或者简单点每次空闲中断后把 DMA 当前数据指针读出来把有效数据拷贝到解析缓冲区。例程用的是后者逻辑更直白空闲中断里记下 DMA 接收计数主循环读到计数变化就去处理新数据。/* 空闲中断回调 */ void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart) { if (huart huart3) { gps_frame_len sizeof(gps_dma_buffer) - __HAL_DMA_GET_COUNTER(huart-hdmarx); gps_frame_ready 1; } } /* 主循环中处理 */ while (1) { if (gps_frame_ready) { for (uint16_t i 0; i gps_frame_len; i) { gps_parse_char(gps_dma_buffer[i], gps_data); } gps_frame_ready 0; } /* 其他任务 */ }__HAL_DMA_GET_COUNTER 拿到的是 DMA 还剩余多少没接收总长度减去它就是实际字节数。这个值一定要在空闲中断里立刻读出来进主循环再读数据早被新帧覆盖了。这里拿到的长度是从上次处理到现在的累计长度不是单帧长度——如果主循环处理得慢可能攒了两三帧数据。所以主循环里的轮询间隔要短或者在中断里直接做解析但那样临界区时间会变长看你的实时性要求。4.2 定位状态字段判断A 和 V 的区别$GPRMC 第二字段是 A 或 V。A 代表定位有效V 代表无效还没锁定卫星或者信号丢失。很多例程只做了解析没做判断用户看到经纬度全是 0 也以为正常。/* 解析定位状态 */ if (strcmp(field_buf, A) 0) { gps_data.fix_status 1; /* 有效定位 */ } else if (strcmp(field_buf, V) 0) { gps_data.fix_status 0; /* 无效定位 */ /* 此时经纬度数据不可信应清标志 */ gps_data.latitude 0.0; gps_data.longitude 0.0; }状态为 V 的时候字段 3、5 可能为空字符串也可能带着上一次的缓存值。稳妥做法是 V 时直接把经纬度清零上层逻辑看到是 0 就知道不能用。我见过有人把 V 状态下的旧数据存下来继续用结果车停在隧道里 GPS 显示位置还在入口——这种逻辑放在入门例程里是个坏榜样。4.3 长时间收不到完整帧超时重置GPS 模块在室内冷启动时可能一两分钟都没有有效帧输出。这时候解析状态机停留在某个状态后续数据乱了也不好恢复。例程里有一个超时机制1 秒内没收到任何新字符就把状态机重置回 GPS_WAIT_HEAD重新等 $ 头。/* 每1ms检查一次超时 */ void gps_check_timeout(void) { static uint32_t last_char_time 0; uint32_t now HAL_GetTick(); if (now - last_char_time 1000) { /* 超过1秒没有新数据重置状态机 */ gps_parse_reset(); } last_char_time now; }这个逻辑看着简单但很多人会漏掉。GPS 帧中间换行符是 \r\n如果你把换行也喂给状态机状态机不处理没关系但如果之前解析卡在一个异常状态比如收到了半个帧头就得靠超时重置兜底。否则下次完整帧来的时候状态机可能误判字段位置解析出离谱数据。5. 避坑GPS 例程常见的 6 个翻车现场5.1 串口全是乱码现象模块上电后串口助手打印出来的全是 $GP 这种半中半西的乱码。原因八成是波特率不匹配。模块默认 9600你配成了 115200或者时钟树没配好APB1 频率不对导致 USART 波特率本身就偏了。另一个常见原因是模块 TTL 电平是 3.3V如果你的 STM32 板子上的串口引脚被某个外设拉低了电平也会出乱码。解决先用串口助手的自动波特率识别一下模块实际输出波特率。确认后再回 CubeMX 里对应改。时钟树按 2.1 节重新过一遍别跳过。5.2 经纬度偏移几十公里现象拿到串口工具输出纬度显示 3158.4608直接当成 31.584608 度填进地图结果位置偏到离谱。原因没做 NMEA 度分格式到十进制的转换。3158.4608 是 31 度 58.4608 分换算成十进制度是 31.9743差着 0.39 度相当于 40 多公里。这个坑是协议格式造成的不是硬件问题。解决所有经纬度必须过一遍转换函数而且南纬西经记得加负号。我在实际项目里经常看到有人只转了北纬东经到了南半球整个数据全反。5.3 定位状态是 V但上层还在用旧数据现象模块没锁星$GPRMC 里状态字段是 V但程序照样把经纬度发到上位机显示的还是几十秒前的位置。原因解析器只关心数字字段忽略了状态位。状态为 V 时后面的经纬度字段可能是空值也可能是旧缓存值直接用必然出错。解决严格按 4.2 节处理V 状态清经纬度上层拿到全 0 就知道是无效定位再配合状态标志位做 UI 提示。5.4 DMA 缓冲区被新数据覆盖解析到半截现象偶发出现解析出的经纬度跳变几秒后又恢复正常。原因DMA 循环模式下缓冲区是不断写入的。如果你在主循环里解析时DMA 又在往同一块缓冲区写数据前半帧可能是新的后半帧被覆盖成更新的数据拼出来就是错值。解决要么用双缓冲交替接收要么在空闲中断里把数据拷贝到独立解析缓冲区用 memcpy 拷 100 字节只要几微秒代价可以接受。我一般会开两个数组一个 DMA 写入一个解析用空闲中断里交换指针。5.5 冷启动要等几分钟才能定位现象模块上电后一直输出 V 状态两三分钟才有 A 状态。原因这不是程序问题是 GPS 模块的首次定位时间TTFF。冷启动时模块要下载星历室内或者天空视野差的时候会更久。解决程序上要做的是在 V 状态期间保持解析器正常工作不要因为没定位就把整个串口关掉。室外空旷处测试等首次定位后再判断程序逻辑。有人在室内测了半天以为模块坏了其实把窗户打开到阳台信号就好了。5.6 帧类型匹配错误$GPGGA 被当成 $GPRMC现象有的模块默认输出的语句类型不是 $GPRMC可能是 $GPGGA 或者 $GPGLL。解析器只认 RMC就啥都收不到。原因模块配置里可以关闭某些语句。默认情况下大部分模块同时输出 GGA 和 RMC但有些模块只输出 GGA或者配置被改过。解决用串口助手先看模块实际输出的语句类型。如果只有 GGA就改解析器的帧类型判断在 GPS_WAIT_TYPE 状态里把 GGA 也加进去。GGA 不包含航向和速度但经纬度、时间、定位状态都有做静态定位够用了。6. 进阶把 PPS 信号用起来例程才算真正落地GPS 模块除了串口数据还有一个 PPSPulse Per Second脉冲引脚每秒输出一个高电平脉冲上升沿和整秒对齐。F103 的定时器输入捕获可以抓这个脉冲。做授时或者需要精确时间同步的场景串口数据里的时间戳是分帧传输的有几十毫秒延迟只有 PPS 才是硬实时。/* TIM2输入捕获PPS引脚1秒中断一次 */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim htim2) { /* 捕获到的计数值结合分频算时间偏差 */ gps_pps_tick __HAL_TIM_GET_COUNTER(htim); gps_pps_flag 1; } }代码里把 PPS 的定时器计数值和本地 RTC 时间做比对每次 PPS 到来时校正一次 RTC长期跑下来本地时钟的累计误差能控制在毫秒级。我在一个数据采集项目里这么干过多台设备各挂一个 GPS 模块用 PPS 对齐采样时刻事后比对数据时间戳偏差不超过 1ms。这比任何软件定时校时都靠谱。另一个实用技巧是把解析出来的数据格式化输出到日志里方便回放调试。可以在串口助手或者 SD 卡里按行记录 $GPRMC 的原始帧之后出问题就能回放对比。我习惯在每次状态从 V 变 A 时打一行日志记录这次定位用了多长时间这是判断模块天线位置是否合理的重要依据。从那以后我每次拿到 GPS 例程第一件事就是先确认模块的默认波特率和输出语句格式再进 CubeMX 配串口最后才看解析代码。这套流程走下来基本没在 GPS 上再翻过车。希望这篇能帮你把 GPS 例程一次跑通。本文还有配套的精品资源点击获取

相关新闻

物流分析到底在分析什么?从指标分层到降本落地的完整框架

物流分析到底在分析什么?从指标分层到降本落地的完整框架

经常有朋友问我说,物流分析到底在分析什么?为什么每次听人讲都觉得很有道理,回到自己公司又不知道怎么下手?这个问题我琢磨了很久。今天这篇文章想把我自己这些年做物流项目分析的思路,从最底层的逻辑到落地时踩过的坑…

2026/10/19 8:21:03 阅读更多 →
从OPC DA到MQTT:工业数据桥接设计与实践指南

从OPC DA到MQTT:工业数据桥接设计与实践指南

1. 为什么要把 OPC DA 搬到 MQTT1.1 OPC DA:老将的尴尬做工业自动化的朋友,对 OPC DA 这三个字母应该都不陌生。从上世纪九十年代开始,它就承担着 Windows 平台下 PLC、DCS、上位机组态软件之间数据交换的重任。简单来说,OPC DA 定…

2026/10/19 8:21:03 阅读更多 →
STM32F103+GPS模块CubeMX例程:串口解析NMEA实现经纬度显示

STM32F103+GPS模块CubeMX例程:串口解析NMEA实现经纬度显示

简介:STM32F103ZET6结合STM32CubeMX的GPS例程,面向嵌入式入门开发者,演示如何基于HAL库快速配置UART、GPIO与中断,实现GPS模块数据接收与NMEA协议解析。资源共188个文件,压缩包8.58MB,包含.ioc工程配置、Ke…

2026/10/19 8:21:03 阅读更多 →

最新新闻

基于Django与Hadoop的出行方式推荐系统设计与实现全解析

基于Django与Hadoop的出行方式推荐系统设计与实现全解析

毕业设计选定这个方向,基本等于把“大数据”这条线走通了。我见过太多人选了大数据方向的题目,最后却只做了个网页加几张图表,Hadoop一点没碰,导师一问数据怎么处理的就答不上来。而这个基于DjangoHadoop的出行方式推荐系统&#…

2026/10/19 13:24:11 阅读更多 →
POA鹈鹕优化算法结合BP神经网络做分类预测的完整实践

POA鹈鹕优化算法结合BP神经网络做分类预测的完整实践

最近有个挺有意思的趋势,群里好几个同行都在问“鹈鹕优化算法”(Pelican Optimization Algorithm,简称POA)和BP神经网络做分类预测的事。说实话,这类“新群体智能优化算法 传统神经网络”的组合,在回归和分…

2026/10/19 13:24:11 阅读更多 →
LoRA微调实战:用低秩适应实现大模型私有化部署与高效训练

LoRA微调实战:用低秩适应实现大模型私有化部署与高效训练

很多朋友问过我一件事:我手上的私有数据——内部文档、客服记录、风格的文案、某类专用的对话——怎么让通用大模型变得“懂我”?最直接的想法是重新预训练一个模型,但那个成本绝大多数团队都扛不住。我一般会推荐用 LoRA,它就是专…

2026/10/19 13:24:11 阅读更多 →
多保真建模策略详解:低成本粗模扫描,高精度校准仿真优化

多保真建模策略详解:低成本粗模扫描,高精度校准仿真优化

多保真模型这个概念,我第一次接触是在试算某个结构优化任务的时候。当时用高精度的CFD算一次就要好几个小时,参数往多了调根本跑不动,只好先用粗糙网格顶着,后来才发现"先用便宜模型扫一轮,再用贵模型精修"这…

2026/10/19 13:24:11 阅读更多 →
Open Code Review:基于Git Diff的CLI代码评审范式

Open Code Review:基于Git Diff的CLI代码评审范式

1. “open-code-review”不是工具名,而是一类新型代码评审范式的代号你搜“open-code-review”,首页跳出的全是零散的 CLI 工具名、报错截图、飞书接入教程,甚至还有人问“DeepSeek 算不算 Agent”——这恰恰说明,当前整个开发者社…

2026/10/19 13:24:11 阅读更多 →
open-code-review实战:规则驱动的自动化代码评审怎么落地

open-code-review实战:规则驱动的自动化代码评审怎么落地

代码评审这件事,我算是交过不少学费的。早年在团队里做Code Review,靠的是纯人工、靠自觉,结果就是每次发版前review像赶集,小问题漏成筛子,规范冲突吵到脸红脖子粗。后来踩过几次坑,试过不少工具&#xff…

2026/10/19 13:23:08 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →