STM32裸机实现Modbus RTU主从站全功能通信
简介本资源是一套面向嵌入式开发初学者与工业通信实践者的STM32 MODBUS RTU全功能码通信实战工程聚焦单片机与PLC、传感器等工业设备的串行互连需求解决MODBUS协议栈移植难、功能码覆盖不全、RS485硬件适配易出错等典型问题。压缩包共787个文件涵盖116个头文件h用于寄存器定义与协议结构体声明、90个C源文件c实现核心MODBUS解析/响应逻辑及HAL驱动封装、216个HTML文档含说明页与API索引与129张PNG图示含帧结构图、接线示意图、调试界面截图辅以bat批处理脚本、hex固件及Keil工程文件uvprojx/uvoptx整体11.14MB结构完整、即开即用。已有5989人学习下载提供从UART/RS485硬件配置、CRC16校验实现、7类标准功能码0x010x10全响应、中断式帧收发到实际寄存器映射的完整闭环代码特别适合快速构建主从一体MODBUS节点或开展工业通信课程实验。1. 这不是又一个“点亮LED”的STM32例程它把MODBUS RTU从协议文档里拽出来跑在真实485总线上功能码覆盖0x01/0x02/0x03/0x04/0x05/0x06/0x0F/0x10——连写多个线圈这种工业现场高频操作都已实测通过你手头那块刚焊好的STM32F103C8T6最小系统板接上MAX485模块连根双绞线就能当从站响应PLC主站轮询或者反过来用它当主站去读取温湿度传感器、电表、变频器的寄存器。这不是教学演示是某高校自动化实验室给产线调试用的压箱底资源包它不依赖HAL库的抽象层黑匣子裸用标准外设库StdPeriph 手搓串口空闲中断 精确定时器校验所有MODBUS帧解析逻辑全在modbus_slave.c和modbus_master.c里摊开写。CRC16查表法用的是Modbus-RTU官方多项式0xA001不是网上乱传的0x8005地址偏移按实际寄存器映射0x0000对应GPIOA_BSRR低16位不是教科书里“假设从0开始”。如果你正被“主站发帧从站没响应”、“CRC校验老失败”、“0x10写多个寄存器只写进前两个”这类问题卡住这份资源就是你该立刻下载的“后悔药”——它不是教你MODBUS是什么而是直接给你一套能拧上螺丝就通电的通讯底盘。2. 从物理层到协议栈为什么选USARTIDLE中断SysTick校验而不是HAL_UART_Receive_IT或DMAMODBUS RTU对时序敏感度远超一般串口通信帧与帧之间必须有≥3.5个字符时间的静默间隔T35否则主站会认为这是同一帧的延续而单帧内部字符间间隔又不能超过1.5个字符时间T15否则从站要丢弃整帧。很多初学者用HAL库的接收中断结果发现主站一发长报文比如0x10写20个寄存器从站只收到前半截——因为HAL默认的中断触发是每个字节进一次中间没有做T15超时判断导致帧被错误切分。这份资源选择回归本质用USART的IDLE中断线路空闲检测捕获帧结束配合SysTick每1ms滴答计数精确实现T15/T35超时控制。下面拆解关键三步2.1 USART硬件配置关闭所有可能干扰时序的选项// stm32f10x_usart.c 配置片段基于StdPeriph库 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate 9600; // 工业现场最常用波特率非115200 USART_InitStructure.USART_WordLength USART_WordLength_8b; // MODBUS RTU强制8位数据位 USART_InitStructure.USART_StopBits USART_StopBits_1; // 强制1位停止位无校验时 USART_InitStructure.USART_Parity USART_Parity_No; // RTU模式禁用校验位 USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, USART_InitStructure); // 关键使能IDLE中断非RXNE USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);逻辑说明IDLE中断在RX线由低变高且持续1个比特时间后触发这恰好对应T15超时点——只要下一个字节没在1.5字符时间内到达IDLE就拉响警报此时DMA或环形缓冲区里的数据即为完整一帧。而RXNE中断只管“有字节来了”不管“字节之间隔了多久”这是绝大多数翻车的根源。2.2 环形缓冲区 IDLE中断服务程序如何避免丢帧和覆盖// 定义环形缓冲区大小需大于最大MODBUS帧256字节足够 #define UART_RX_BUFFER_SIZE 256 uint8_t uart_rx_buffer[UART_RX_BUFFER_SIZE]; volatile uint16_t uart_rx_head 0; volatile uint16_t uart_rx_tail 0; // IDLE中断服务函数精简版 void USART1_IRQHandler(void) { USART_TypeDef* USARTx USART1; uint16_t temp; if (USART_GetITStatus(USARTx, USART_IT_IDLE) ! RESET) { // 清除IDLE标志位读SR再读DR temp USARTx-SR; temp USARTx-DR; // 计算本次接收到的字节数 uint16_t len (uart_rx_head uart_rx_tail) ? (uart_rx_head - uart_rx_tail) : (UART_RX_BUFFER_SIZE - uart_rx_tail uart_rx_head); if (len 0 len MODBUS_MAX_FRAME_LENGTH) { // 将环形缓冲区数据拷贝到modbus帧缓冲区 modbus_frame_received(uart_rx_buffer uart_rx_tail, len); } // 重置缓冲区指针注意此处不直接清空仅移动tail uart_rx_tail uart_rx_head; } }参数说明MODBUS_MAX_FRAME_LENGTH定义为256覆盖0x10功能码最大写入125个寄存器250字节数据6字节头尾uart_rx_head由RX中断更新uart_rx_tail由IDLE中断更新二者差值即为待处理帧长。这里不做memcpy到新内存而是直接用指针偏移计算长度省去内存拷贝开销——在48MHz主频下这对实时性至关重要。2.3 SysTick驱动的T35帧间隔检测主站轮询节奏的守门人// systick.c 中每1ms调用一次 volatile uint32_t modbus_frame_gap_ms 0; void SysTick_Handler(void) { if (modbus_frame_gap_ms 0) { modbus_frame_gap_ms--; } } // 在modbus_frame_received()中启动计时 void modbus_frame_received(uint8_t* data, uint16_t len) { // ... CRC校验、功能码解析等 ... // 帧处理完毕后启动T35倒计时3.5字符时间 ≈ 3.5 * 10 * 1000 / 9600 ≈ 3.65ms → 取4ms modbus_frame_gap_ms 4; } // 主循环中检查是否可发响应帧 if (modbus_frame_gap_ms 0 modbus_response_ready) { modbus_send_response(); modbus_response_ready 0; }为什么是4ms9600bps下1字符10bit8数据1起始1停止传输1字符耗时10/9600≈1.04msT353.5×1.04≈3.64ms。取整4ms既留出余量又避免SysTick精度不足导致误判。若用HAL_Delay或while循环延时一旦被其他中断打断T35就失准——SysTick是唯一可靠方案。3. 功能码全实现从0x01读线圈到0x10写多个寄存器每条路径都经过PLC主站真机验证这份资源最硬核的价值在于它把MODBUS RTU规范里8个核心功能码全部落地且每个都针对工业现场真实痛点做了加固。例如0x05写单个线圈标准只要求返回原请求帧但实际PLC主站常带重发机制若从站响应延迟主站可能重复发送同一帧——代码里专门加了“请求帧指纹比对”避免重复执行输出动作再如0x10写多个寄存器网上多数例程直接memcpy但真实设备要求“写入过程不可被打断”这里用临界区保护写后校验。下面以0x03读保持寄存器和0x10写多个寄存器为例展示关键实现逻辑3.1 0x03读保持寄存器地址映射与字节序的双重陷阱// modbus_slave.c 中处理0x03功能码的核心逻辑 case MODBUS_FUNC_READ_HOLDING_REGISTERS: // 0x03 // 解析请求帧起始地址2字节、寄存器数量2字节 uint16_t start_addr (frame[2] 8) | frame[3]; uint16_t reg_count (frame[4] 8) | frame[5]; // 【关键校验】地址范围限制防止越界读取RAM if (start_addr reg_count HOLDING_REG_COUNT) { modbus_send_exception(frame, MODBUS_EXC_ILLEGAL_DATA_ADDRESS); break; } // 构建响应帧功能码字节数寄存器数据大端序 response[0] MODBUS_FUNC_READ_HOLDING_REGISTERS; response[1] (uint8_t)(reg_count * 2); // 每个寄存器2字节 for (uint16_t i 0; i reg_count; i) { uint16_t reg_val holding_regs[start_addr i]; response[2 i*2] (reg_val 8) 0xFF; // 高字节先发MODBUS大端 response[2 i*2 1] reg_val 0xFF; // 低字节后发 } modbus_send_response(response, 2 reg_count*2); break;参数说明HOLDING_REG_COUNT在modbus_config.h中定义为100对应0x0000~0x0063地址空间holding_regs[]是全局uint16_t数组直接映射到片内SRAM。重点看字节序MODBUS RTU规定寄存器数据按大端Big-Endian传输即高位字节在前这点和x86 PC相反但和STM32 Cortex-M内核一致——所以直接8和0xFF即可无需htons()。3.2 0x10写多个寄存器临界区保护与写后校验的工业级保障case MODBUS_FUNC_WRITE_MULTIPLE_REGISTERS: // 0x10 uint16_t start_addr (frame[2] 8) | frame[3]; uint16_t reg_count (frame[4] 8) | frame[5]; uint8_t byte_count frame[6]; if (byte_count ! reg_count * 2 || start_addr reg_count HOLDING_REG_COUNT) { modbus_send_exception(frame, MODBUS_EXC_ILLEGAL_DATA_ADDRESS); break; } // 【工业级防护】进入临界区禁止任何中断修改寄存器 __disable_irq(); for (uint16_t i 0; i reg_count; i) { uint16_t reg_val (frame[7 i*2] 8) | frame[7 i*2 1]; holding_regs[start_addr i] reg_val; } __enable_irq(); // 【写后校验】读回刚写的值确认无误再响应 bool write_ok true; for (uint16_t i 0; i reg_count; i) { if (holding_regs[start_addr i] ! ((frame[7 i*2] 8) | frame[7 i*2 1])) { write_ok false; break; } } if (write_ok) { // 响应帧只需回传原地址和数量标准要求 response[0] MODBUS_FUNC_WRITE_MULTIPLE_REGISTERS; response[1] (start_addr 8) 0xFF; response[2] start_addr 0xFF; response[3] (reg_count 8) 0xFF; response[4] reg_count 0xFF; modbus_send_response(response, 5); } else { modbus_send_exception(frame, MODBUS_EXC_SLAVE_DEVICE_FAILURE); } break;为什么需要临界区若在写入过程中发生ADC采集中断而ADC回调函数也修改holding_regs[]会导致数据错乱。__disable_irq()是Cortex-M最轻量的保护方式比FreeRTOS的mutex更底层、更可靠。而写后校验则是某次产线调试中发现的血泪经验某批次MAX485芯片在高温下偶发写入失败加了校验后主站立刻报错避免了控制指令静默丢失。3.3 其他功能码的差异化设计要点功能码用途本资源特殊处理0x01 读线圈读取DO状态使用GPIO_ReadInputDataBit()直接读引脚非读寄存器变量确保实时性0x05 写单个线圈控制单个DO增加“请求指纹缓存”5秒内相同帧只执行一次防PLC重发误动作0x06 写单个寄存器设置参数写入前触发on_reg_write_callback()钩子函数支持用户自定义校验逻辑如限幅0x0F 写多个线圈批量控制DO数据按字节打包每字节8个线圈用位运算data_byte (1bit_pos)解析4. 避坑指南那些让工程师凌晨三点还在抓头发的MODBUS RTU典型翻车现场MODBUS RTU看似简单实则处处是坑。这份资源在某跨平台系统联调中踩过所有常见雷下面列出5条真实发生的、带解决方案的避坑记录。每一条都对应一次产线停机或实验室炸机事件绝非纸上谈兵。4.1 现象主站发0x03读寄存器从站响应帧CRC校验失败Wireshark显示最后两字节乱码原因modbus_send_response()函数中发送完数据后未等待USART发送完成TXE标志就立即拉高RE/DE引脚关闭485发送使能导致最后一两个字节被截断。解决在modbus_send_response()末尾添加严格等待while(USART_GetFlagStatus(USART1, USART_FLAG_TC) RESET); // 等待发送完成TCTransmit Complete GPIO_SetBits(GPIOA, GPIO_Pin_2); // 拉高DE/RE切换回接收态注意不能只等TXE发送寄存器空因为TXE置位后移位器还在发必须等TC整个帧发完。4.2 现象波特率设为19200时通讯正常换成9600后主站收不到响应示波器看485波形有畸变原因PCB布线中MAX485的RO引脚接收输出走线过长且未加100Ω终端电阻9600bps下信号反射不明显但19200bps因边沿陡峭引发振铃被误判为噪声。解决在485总线两端最远两个节点各并联一个120Ω电阻RS485标准阻抗RO引脚就近加0.1μF去耦电容。本资源配套的PCB设计文件中R12和C8即为此预留。4.3 现象0x10写多个寄存器时主站发10个寄存器数据从站只成功写入前7个后3个值为0原因frame[]缓冲区大小设为64字节而0x10最大帧长11字节头200字节数据2字节CRC213字节严重溢出导致栈破坏。解决在modbus_config.h中将MODBUS_MAX_FRAME_LENGTH从64改为256并用#pragma pack(1)确保结构体无填充#pragma pack(1) typedef struct { uint8_t slave_addr; uint8_t func_code; uint8_t data[256]; // 动态长度由func_code决定 } ModbusFrame; #pragma pack()4.4 现象多台从站挂同一485总线某台从站偶尔丢失主站轮询但单独测试完全正常原因各从站的485芯片DE/RE控制引脚共用同一IO但驱动能力不足当3台以上从站同时切换方向时电平建立时间超标100ns导致总线冲突。解决为每台从站的DE/RE引脚增加SN74LVC1G07单路缓冲器或改用软件延时在拉高DE前插入for(volatile int i0; i100; i);约1μs确保电平稳定后再发数据。4.5 现象使用ST-Link调试时MODBUS通讯完全失效拔掉调试器一切正常原因SWD调试接口SWCLK/SWDIO与USART1的TX/RX引脚复用如STM32F103C8T6的PA9/PA10调试器占用引脚导致串口无法工作。解决在system_stm32f10x.c中将RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO, ENABLE);提前到RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);之前并在GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);前调用AFIO-MAPR | AFIO_MAPR_USART1_REMAP;强制重映射USART1到PB6/PB7。5. 主站模式实战用STM32当“PLC大脑”轮询3台从站采集温度并动态调节加热功率前面讲的都是从站但这份资源真正的杀手锏在于——它把主站模式也做成了可直接移植的模块。某模拟项目X中用一片STM32F103作为主控通过485总线轮询3台温控从站地址0x01/0x02/0x03每200ms读取一次当前温度0x03读保持寄存器0x0000根据PID算法计算加热功率再用0x06写单个寄存器0x0001下发PWM占空比。整个流程不依赖RTOS纯状态机驱动下面给出核心调度逻辑和关键技巧5.1 主站状态机设计四状态循环杜绝阻塞typedef enum { MASTER_IDLE, // 空闲准备发下一帧 MASTER_SEND_REQ, // 发送请求帧 MASTER_WAIT_RESP, // 等待响应带超时 MASTER_PROCESS_RESP // 处理响应数据 } ModbusMasterState; ModbusMasterState master_state MASTER_IDLE; uint32_t master_timeout_ms 0; void modbus_master_task(void) { switch(master_state) { case MASTER_IDLE: // 轮询3台从站地址递增 current_slave_addr (current_slave_addr % 3) 1; modbus_master_build_read_req(current_slave_addr, 0x0000, 1); // 读1个寄存器 master_state MASTER_SEND_REQ; break; case MASTER_SEND_REQ: modbus_send_request(); master_timeout_ms 200; // 响应超时200ms master_state MASTER_WAIT_RESP; break; case MASTER_WAIT_RESP: if (modbus_frame_received_flag) { modbus_frame_received_flag 0; master_state MASTER_PROCESS_RESP; } else if (master_timeout_ms 0) { // 超时标记该从站离线跳过处理 slave_online[current_slave_addr-1] 0; master_state MASTER_IDLE; } break; case MASTER_PROCESS_RESP: if (modbus_parse_response()) { // 解析成功更新温度值 temperature[current_slave_addr-1] modbus_resp_data[0]; slave_online[current_slave_addr-1] 1; // PID计算简化版 float error setpoint - temperature[current_slave_addr-1]; pwm_duty[current_slave_addr-1] (int)(Kp * error Ki * integral Kd * (error - last_error)); last_error error; // 下发PWM占空比0x06写单个寄存器 modbus_master_build_write_req(current_slave_addr, 0x0001, pwm_duty[current_slave_addr-1]); master_state MASTER_SEND_REQ; } else { master_state MASTER_IDLE; } break; } }为什么不用RTOS在资源受限的F103上创建4个任务3从站1主循环会吃掉近1/3 RAM。状态机用1个全局变量1个超时计数器内存占用10字节且确定性更高——每200ms必完成一轮轮询无任务切换抖动。5.2 主站超时管理SysTick毫秒级软定时器的黄金组合// systick.c 中每1ms执行 void SysTick_Handler(void) { if (master_timeout_ms 0) master_timeout_ms--; if (modbus_frame_gap_ms 0) modbus_frame_gap_ms--; } // 主循环中调用 while(1) { modbus_master_task(); // 主站状态机 modbus_slave_task(); // 从站监听即使做主站也要能响应其他主站 delay_ms(1); // 保证SysTick精准1ms }关键技巧主站超时200ms和从站T354ms共用同一个SysTick中断避免多定时器资源冲突。delay_ms(1)不是阻塞而是让CPU在1ms内空转确保主循环频率严格等于1kHz——这是PID控制稳定的前提。5.3 主站帧构建与解析如何避免“发出去的帧自己都看不懂”步骤代码位置关键细节构建请求帧modbus_master_build_read_req()自动填充从站地址、功能码、起始地址、寄存器数量并调用modbus_calc_crc16()生成CRC发送帧modbus_send_request()拉高DE→等待1μs→发送→等待TC→拉低DE→等待T354ms→切换回接收态解析响应modbus_parse_response()先校验CRC再检查从站地址是否匹配当前轮询地址最后验证功能码是否为0x03非异常帧血泪经验某次调试中主站发0x03给0x01从站却收到0x02从站的0x03响应地址错位。排查发现是modbus_parse_response()里忘了校验地址字段直接把所有0x03帧都当成本次响应处理。从此我养成了习惯任何MODBUS帧解析第一行必须是if (frame[0] ! expected_slave_addr) return false;从那以后我每次写MODBUS主站代码都强制走一遍“地址-CRC-功能码-数据长度”四重校验哪怕多写10行代码也比凌晨三点对着示波器猜波形强。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

仓颉 stdx 的 Form 类实战指南:URL 查询参数与表单键值对的构造与读取

仓颉 stdx 的 Form 类实战指南:URL 查询参数与表单键值对的构造与读取

标准库网络密码学并发编程 【免费下载链接】cangjie_stdx 仓颉编程语言提供了 stdx 模块,该模块提供了网络、安全等领域的通用能力。 项目地址: https://gitcode.com/Cangjie/cangjie_stdx 点击查看 免费下载 本指南围绕 stdx.encoding.url 包中的 Form…

2026/10/15 18:55:43 阅读更多 →
STM32F4多通道DMA ADC配置指南:从原理到避坑

STM32F4多通道DMA ADC配置指南:从原理到避坑

简介:这份资源面向STM32F4嵌入式开发者与学习者,聚焦多通道ADC与DMA协同采集这一实战主题,帮助解决多路模拟信号高速采样时CPU占用高、中断频繁、实时性不足的问题。压缩包共103个文件,约846KB,以47个.h头文件与46个.c…

2026/10/15 18:55:43 阅读更多 →
业务部门用了ChatBI后,怎么优化实现持续决策增值

业务部门用了ChatBI后,怎么优化实现持续决策增值

导语 一句话答案:业务部门用ChatBI(观远问数Agent,是基于大语言模型打造的智能数据问答产品,支持业务人员用自然语言快速取数、获取数据洞察)实现持续决策增值,核心是从“单次临时问数”升级为“场景拓展-知…

2026/10/15 18:55:43 阅读更多 →

最新新闻

AI论文写作要点梳理与前沿研究成果应用实践指南

AI论文写作要点梳理与前沿研究成果应用实践指南

外文文献“白嫖”与高效阅读全攻略 宝子们,是不是一提到下载外文文献就头大? 想找的文献要么全网搜不到,要么下载流程复杂到让人原地爆炸。好不容易在某个小网站找到了资源,又担心版权问题不敢点,更别说有些平台动辄几…

2026/10/15 19:38:32 阅读更多 →
人脸识别开集测试:从闭集幻觉到真实拒识的工程实践

人脸识别开集测试:从闭集幻觉到真实拒识的工程实践

1. 开集与闭集测试:人脸识别系统落地前必须跨过的那道坎 我第一次在某高校实验室参与人脸识别项目验收时,被现场演示结果惊得愣在原地——模型在内部测试集上准确率高达99.2%,可当现场随机邀请三位未录入过人脸的访客走进识别区域&#xff0c…

2026/10/15 19:38:32 阅读更多 →
深耕支付宝收钱码推广领域,拓推客以专业合作服务赋能地推从业者

深耕支付宝收钱码推广领域,拓推客以专业合作服务赋能地推从业者

移动支付已深度融入日常消费与商业经营场景。线下商户对于便捷收款、数字化经营工具及相关支付服务的需求持续受到关注,与之相关的商户拓展和推广服务,也逐渐成为连接支付产品与线下经营场景的重要环节。在这一行业背景下,专业化、规范化的推…

2026/10/15 19:38:32 阅读更多 →
记忆系统演化:从简单缓存到多层认知架构

记忆系统演化:从简单缓存到多层认知架构

在大模型驱动的智能体(AI Agent)系统研发初期,绝大多数团队对“记忆”的理解仅仅停留在会话上下文的传递上。早期的 LangChain 会话记忆组件(如 ConversationBufferMemory 或 ConversationSummaryMemory)通过简单的字符…

2026/10/15 19:38:32 阅读更多 →
观测全景:基于 OpenInference 的可观测体系总结

观测全景:基于 OpenInference 的可观测体系总结

随着大语言模型(LLM)与多智能体(Multi-Agent System)系统从概念验证(POC)全面进入企业生产级核心业务,传统的微服务可观测性体系(Metrics、Logs、Traces)遭遇了前所未有的…

2026/10/15 19:38:32 阅读更多 →
OpenCV+Python轻量物体识别:纯CPU端到端方案

OpenCV+Python轻量物体识别:纯CPU端到端方案

简介:本资源是一套面向Python与OpenCV初学者及计算机视觉入门开发者的自定义物体识别实战教程,聚焦于零基础构建可识别任意目标的检测模型,适用于智能监控、工业质检、教学实验等场景。压缩包共709个文件,含663张标注用JPG图像、2…

2026/10/15 19:37:32 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →