STM32F103外挂ADS1115 16位ADC驱动详解:从I2C配置到精度校准
简介面向STM32F103的ADS1115驱动代码包适合嵌入式开发者、STM32入门者以及需要高精度16位ADC采集的物联网、仪器仪表和电池供电类项目。驱动内包含SCL、SDA等引脚注释对照ADS1115芯片手册接线即可验证I2C通信配套工程基于STM32标准外设库覆盖I2C初始化、PGA增益配置、采样率设置、单次/连续转换及读取转换结果等关键环节。压缩包共189个文件以h/c源码、d/o编译中间文件、uvprojx工程文件、hex烧录文件、lst/map链接信息等为主整体约6.69MB同时集成I2C、ADC、定时器等标准外设驱动源码便于移植和二次开发。该驱动支持4路独立差分/单端输入、16位分辨率及可编程增益放大配合官方芯片手册可快速理解寄存器配置已有2845人浏览学习适合初学者作为ADC驱动样板也方便工程师快速集成ADS1115完成模拟量采集。1. ADS1115 对 STM32F103 意味着什么一颗 16 位 ADC 如何简化采集链路做单片机采集最烦的不是写驱动而是信号调理那一摊子事。ADS1115 是 TI 出的 16 位 ΔΣ ADC内置可编程增益放大器PGA、基准源、I2C 接口和比较器一个芯片把前端放大、采样、通信全包了。对 STM32F103 这类没有内部高精度 ADC 的 MCU 来说外挂 ADS1115 等于直接把采集链路从「运放 基准 采样」压缩成「一颗芯片 两根 I2C 线」。实际测试下来用默认 PGA ±6.144V 量程测 3.3V 电压有效分辨率能到 0.1mV 级别比 STM32F103 内置 12 位 ADC 强一个量级。这份驱动代码基于 STM32F103 标准外设库覆盖单次转换、连续转换、PGA 配置和数据速率切换适合做电池电压监测、工业传感器采集、精密仪表这类场景。新手按步骤接线就能跑起来熟手可以直接改宏定义适配自己的 PCB。2. 硬件连接与 I2C 通信机制先把地址、引脚和时序搞清楚2.1 引脚连接与电平匹配三个细节决定成败ADS1115 的电源范围是 2.0V 到 5.5VSTM32F103 常用的 3.3V 供电完全在范围内。SDA 和 SCL 是开漏输出必须接上拉电阻常见做法是接 4.7kΩ 到 VDD。这里有个容易忽略的点如果 STM32F103 是 5V 供电而 ADS1115 用 3.3V 供电I2C 引脚的电平匹配就得处理最简单的方案是给 ADS1115 单独供 3.3VSDA 和 SCL 用两个 MOS 管做电平转换或者干脆用支持 5V 容忍的 GPIO 引脚。ADDR 引脚决定 I2C 地址这是新手最容易踩的坑。ADDR 接 GND 时地址是 0x48接 VDD 时是 0x49接 SDA 时是 0x4A接 SCL 时是 0x4B。如果板上同时挂多颗 ADS1115每个芯片的 ADDR 必须接不同的位置否则地址冲突。实际项目里一般接 GND省事但要注意别跟板上其他 I2C 设备的地址撞了。ALERT/RDY 引脚是可选的中断输出。配置成比较器模式时转换结果超过阈值会拉低这个引脚可以直接接到 STM32F103 的外部中断引脚上做阈值告警。配置成转换完成模式时每一次转换结束都会拉低可以用来做数据就绪信号配合 DMA 或中断读取。2.2 Config 寄存器的 16 位布局增益、速率和模式都是靠 bit 拼出来的ADS1115 的寄存器操作不复杂总共就 4 个寄存器Conversion0x00只读、Config0x01读写、Lo_thresh0x02、Hi_thresh0x03。核心是 Config 寄存器的 16 位配置字每一位都有明确含义。Bit名称功能15OS单次转换启动位写 1 启动一次转换14-12MUX输入多路选择000 是 AIN0-AIN1 差分100 是 AIN0-GND11-9PGA增益设置000 是 ±6.144V001 是 ±4.096V010 是 ±2.048V8MODE0 连续转换1 单次转换默认7-5DR数据速率000 是 8 SPS100 是 1600 SPS4COMP_MODE比较器模式0 传统比较器3COMP_POL比较器极性0 低电平有效2COMP_LAT比较器锁存0 非锁存1-0COMP_QUE比较器触发次数11 禁用比较器PGA 位段是整个配置里最重要的部分因为它直接决定测量量程和分辨率。比如用 ±2.048V 量程时16 位 ADC 的 LSB 是 2.048V / 32768 ≈ 62.5μV这个量程适合测 0-2V 的传感器信号。如果信号可能超过 2V就得用 ±4.096V 或 ±6.144V 量程量程越大 LSB 越大精度越低。实际项目里应该先估算信号的最大幅值再选 PGA不要贪分辨率选小量程然后信号削顶。数据速率位段同样有讲究。8 SPS 时噪声最低但速度慢1600 SPS 时速度快但有效分辨率会下降。ADS1115 是 ΔΣ 型 ADC内部有数字滤波器数据速率越低滤波越强。我一般采集缓慢变化的电压电池、温度用 128 SPS采动态信号才用 475 SPS 以上这样能在速度和精度之间取个平衡。2.3 I2C 读写流程一次完整的单次转换要执行三个步骤ADS1115 的 I2C 通信遵循标准协议地址 7 位最后一位是读写标志。写操作是主机发送设备地址加写位然后发送寄存器指针字节再发送两个配置字节。读操作是主机先发送设备地址加写位和寄存器指针然后重启总线发送设备地址加读位读回两个字节。单次转换的完整流程分三步。第一步向 Config 寄存器写入配置字OS 位写 1 启动转换。第二步等待转换完成如果是单次模式Config 寄存器里的 OS 位会从 1 变成 0轮询这个位就能判断转换是否结束。第三步读 Conversion 寄存器得到 16 位转换结果。注意转换结果是有符号数用差分输入时可能出现负值必须做符号扩展处理。连续转换模式省去了反复启动的过程配置好之后 ADS1115 会按照设定的数据速率不断刷新 Conversion 寄存器。但连续模式有个特点读寄存器的时候可能正好赶上数据更新导致读出高低字节不是同一时刻的。解决方法是先读低字节再读高字节因为 ADS1115 的数据寄存器在低字节被读取时会被锁定直到高字节读完才解锁这个机制叫「字节锁定」。3. 驱动代码实现从软件 I2C 到单次与连续转换的完整流程3.1 软件模拟 I2C 还是硬件 I2CSTM32F103 场景下的选择STM32F103 有硬件 I2C 外设但历史上这个外设的口碑不太好主要问题是时序不稳定、总线锁死时不好恢复。实际开发中很多做 STM32F103 的工程师宁愿用 GPIO 模拟 I2C也不碰硬件外设原因很简单软件模拟 I2C 代码可控、时序透明、出问题好排查而且 ADS1115 的数据速率最高 1600 SPS模拟 I2C 的速率完全够用。这份驱动代码用的就是软件模拟 I2C核心是四个函数起始信号、停止信号、发送字节、接收字节。模拟 I2C 的时钟频率由延时函数控制主频 72MHz 时用几个空循环就能把 SCL 频率压在 100kHz 到 400kHz 之间。代码结构上分两层底层是 I2C 位操作上层是 ADS1115 的寄存器读写和配置。3.2 初始化与单次读取先跑通数据链路以下是驱动代码中初始化与单次读取的核心部分先看 I2C 底层和读取函数#define ADS1115_I2C_ADDR 0x48 // ADDR 接 GND void I2C_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD; // 开漏输出 GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7); }GPIO 配成开漏输出这样外部上拉电阻才能把电平拉高。初始化完成后 SDA 和 SCL 默认都是高电平符合 I2C 空闲状态的要求。开漏模式是模拟 I2C 的关键如果用推挽输出多设备通信时会出问题。uint16_t ADS1115_ReadSingleShot(void) { // 配置字OS1 启动转换MUXAIN0-GNDPGA±4.096V128 SPS uint8_t config_high 0x80 | (0x01 4) | (0x01 1); // 1000 0010: OS1, MUX100(AIN0-GND), PGA001(±4.096V) uint8_t config_low (0x01 5) | (0x01 3); // 0010 1000: MODE1 单次, DR100(128SPS), COMP_QUE11 禁用比较器 I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); // 写入操作 I2C_SendByte(0x01); // 指向 Config 寄存器 I2C_SendByte(config_high); I2C_SendByte(config_low); I2C_Stop(); // 等待转换完成轮询 Config 寄存器 OS 位 uint8_t os_flag 0; while (!os_flag) { I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x01); I2C_Stop(); I2C_Start(); I2C_SendByte((ADS1115_I2C_ADDR 1) | 0x01); // 读取操作 os_flag I2C_ReadByte(0) 0x80; // 读 Config 高字节 I2C_Stop(); delay_ms(1); // 避免忙等过热 } // 读取 Conversion 寄存器 I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x00); I2C_Stop(); I2C_Start(); I2C_SendByte((ADS1115_I2C_ADDR 1) | 0x01); uint8_t hi I2C_ReadByte(1); uint8_t lo I2C_ReadByte(0); I2C_Stop(); return (hi 8) | lo; }逻辑说明这个函数做了两件事先往 Config 寄存器写配置字启动单次转换然后轮询 OS 位等待转换结束最后读回 16 位结果。配置字的位段编排严格按数据手册来OS 位置 1 是启动信号MUX 选 AIN0 对 GND 的单端输入PGA 设成 ±4.096VMODEL 位置 1 表示单次模式。注意配置完寄存器后 I2C 发送指针还停在 Config 寄存器位置不需要重新写指针轮询的时候直接读就好。参数说明ADS1115_I2C_ADDR 这个宏定义在 ADDR 引脚接 GND 时是 0x48如果硬件上 ADDR 接 VDD要改成 0x49。config_high 里的 PGA 位段bit11-9对应代码里的 (0x01 4)因为 MUX 占了 bit14-12 三位PGA 从 bit11 开始所以左移 4 位正好落到 PGA 位段。config_low 里 (0x01 5) 是 DR 位段设成 128 SPS(0x01 3) 是 COMP_QUE 设成 11 禁用比较器。轮询 OS 位的时候如果一直等不到多半是 I2C 通信有问题后面第 4 章专门讲。3.3 连续采集与阈值告警扩展驱动覆盖更多场景连续采集模式适合需要周期性读取数据的场景比如电池电压实时监测。配置一次后ADC 会按设定的数据速率持续刷新结果寄存器不需要反复启动转换。void ADS1115_InitContinuous(void) { uint8_t config_high 0x00 | (0x01 4) | (0x01 1); // OS0 忽略MUXAIN0-GNDPGA±4.096V uint8_t config_low (0x00 5) | (0x01 3); // MODE0 连续转换模式DR128SPSCOMP_QUE11 禁用比较器 I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x01); I2C_SendByte(config_high); I2C_SendByte(config_low); I2C_Stop(); } uint16_t ADS1115_ReadContinuous(void) { uint8_t hi, lo; I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x00); I2C_Stop(); I2C_Start(); I2C_SendByte((ADS1115_I2C_ADDR 1) | 0x01); hi I2C_ReadByte(1); lo I2C_ReadByte(0); // 读低字节时数据寄存器被锁定 I2C_Stop(); return (hi 8) | lo; }连续模式和单次模式的区别就一个 bitMODE 位段写 0。连续模式下 OS 位不需要动转换结果会自动更新。读连续数据时有个细节如果数据更新发生在读取过程中ADS1115 会锁定数据寄存器直到两个字节都被读走。所以读取顺序一定是先高后低不能反否则可能读到新旧混合的 16 位值。阈值告警是 ADS1115 内置比较器的一个实用功能。配置 Hi_thresh 和 Lo_thresh 之后转换结果超过阈值会触发 ALERT/RDY 引脚变化外部中断就能唤醒 MCU 处理不用一直轮询。阈值寄存器的数值格式跟转换结果一样16 位有符号数配置的时候要按对应的 PGA 量程换算。启用比较器时 COMP_QUE 位段不能设成 11否则比较器被禁用ALERT 引脚不会动作。4. 避坑与常见问题采集值漂移、总线锁死和时序玄学4.1 采集值一直在跳罪魁祸首是 PGA 量程和电源噪声现象同样的输入电压连续读十次结果最低值和最高值差了几十个 LSB换算成电压是几十毫伏的波动。原因最常见的有两个。一个是 PGA 量程选太大±6.144V 量程下 LSB 是 187.5μV输入信号只有 1V量化噪声占了很大比重。另一个是电源纹波直接耦合到模拟输入ADS1115 的 VDD 和参考源是共用的如果供电纹波大转换结果会跟着抖。解决先根据实际信号幅值收缩 PGA 量程。信号最大 2.5V 就用 ±4.096V最大 1.5V 就用 ±2.048V把 LSB 降下来。其次在 VDD 引脚就近加 0.1μF 陶瓷电容和 10μF 钽电容模拟输入走线尽量短而粗避开高频数字信号线。如果还是跳降低数据速率到 32 SPS 或 16 SPS数字滤波器会压制高频噪声。4.2 I2C 总线锁死SDA 被拉低恢复时序比你想的复杂现象程序跑着跑着 I2C 通信突然卡死用示波器看 SDA 一直是低电平SCL 正常翻转MCU 复位也没用。原因模拟 I2C 最怕的就是总线锁死。常见触发条件是通信过程中发生复位或掉电从设备处于半通信状态SDA 被从设备拉住不放。这时候单纯发停止信号没用因为总线已经不在主机控制下。解决我一般会写一个总线恢复函数在初始化 I2C 之前先调用。做法是拉高 SCL然后手动翻转 SDA 最多 9 个时钟周期每次翻转后释放 SDA直到 SDA 变高最后发一个停止信号。这个操作相当于给从设备一个完整的时钟序列让它结束当前的通信状态。代码实现就是几个 GPIO 操作加循环判断放在 I2C 初始化最前面每次上电都强制执行。4.3 I2C 地址配错了读回全 0xFFADDR 引脚的接法决定一切现象写配置寄存器没反应读回来的数据全是 0xFFI2C 通信看起来正常但数据完全是乱的。原因ADS1115 的地址依赖 ADDR 引脚的接法实际项目里 ADDR 没固定好或者飞线接触不良导致地址漂移。还有一种情况是 ADDR 接 SDA 或 SCL 的配置被忽略因为这两个接法依赖引脚状态上电时序不对会识别错误。解决排查时先用逻辑分析仪抓 I2C 波形看发送的地址是不是 0x48。然后检查 ADDR 引脚的焊接和连接确认它被固定到 GND 或 VDD不要悬空。如果是多颗 ADS1115 共用总线每颗的 ADDR 必须接不同位置上电后先扫描总线上所有可能的地址0x48 到 0x4B确认每颗芯片都能被寻址到。4.4 轮询 OS 位永远等不到问题出在配置字本身现象写寄存器后轮询 Config 寄存器的 OS 位一直读不到 0程序卡死在 while 循环里。原因OS 位只有在单次转换模式下才会从 1 变成 0如果配置字里 MODE 位段写成了连续模式OS 位根本不会改变。另外如果 COMP_QUE 位段设成非 11比较器被启用某些配置组合下状态机的行为跟预期不同。解决仔细检查 config_low 里 MODE 位段的设置。单次模式必须写 1也就是 (0x01 8)。另外把 COMP_QUE 设成 11 禁用比较器排除干扰。用逻辑分析仪确认写入的字节跟代码里的宏定义一致防止类型转换问题导致位段错位。4.5 读取结果一直为正数差分输入变成单端MUX 位段设错了现象用差分输入AIN0-AIN1接传感器负向信号读出来是 0没有出现预期的负数结果。原因MUX 位段没设对默认配置选了 AIN0-GND 而不是 AIN0-AIN1。差分模式下信号为负时转换结果是有符号数最高位是符号位如果读回的数字没做符号扩展负数会被当成大正数。解决代码里 MUX 位段在 config_high 的 bit14-12差分 AIN0-AIN1 对应 000单端 AIN0-GND 对应 100。如果用的是差分输入把 MUX 位段改成 000。读回结果后做符号扩展代码是int16_t value (int16_t)raw;C 语言里这个转换会自动做符号扩展不需要手动处理。另外如果信号可能为负PGA 量程也要留足负向余量不能只在正半轴考虑。5. 提升精度的校准方法偏移消除与增益误差修正5.1 偏移校准短路输入测零点把系统误差抠出来ADS1115 出厂有偏移误差虽然出厂校准过但在小增益和小量程下残余偏移仍然可见。实际测试 ±4.096V 量程下短路输入时读数可能偏高或偏低十几到几十个 LSB。校准方法很简单把 ADC 输入对地短路采集 N 次取平均得到偏移量记作 offset之后每次读值都减去这个 offset。int16_t ads1115_offset 0; void ADS1115_CalibrateOffset(uint8_t samples) { int32_t sum 0; for (uint8_t i 0; i samples; i) { sum (int16_t)ADS1115_ReadSingleShot(); delay_ms(10); } ads1115_offset (int16_t)(sum / samples); } int16_t ADS1115_ReadCalibrated(void) { int16_t raw (int16_t)ADS1115_ReadSingleShot(); return raw - ads1115_offset; }逻辑说明校准函数把输入短路后连续采样多次取平均比单次采样更能抑制噪声。实际项目中短路输入要放在靠近芯片的引脚端如果从板端短路走线上的压降也会被算进偏移里。校准完成后每次读取都执行一次减法这个操作不额外占用 I2C 总线时间。参数说明samples 取值建议 8 到 16太少平均效果不明显太多浪费时间10ms 的间隔保证每次采样都是独立的。注意 sum 用 int32_t防止 16 个采样值累加时溢出。测得的偏移量可能是正也可能是负取决于芯片的个体差异。5.2 增益校准用基准源测实际斜率修正比例误差增益误差主要是片内基准源的精度限制导致的一般在 ±0.5% 以内但对高精度测量来说不可忽略。校准方法是用一个已知精度的基准电压比如外部 2.048V 基准源作为输入采集实际读数然后计算修正系数。float ads1115_gain 1.0f; void ADS1115_CalibrateGain(float reference_voltage, uint8_t samples) { float sum 0.0f; for (uint8_t i 0; i samples; i) { int16_t raw ADS1115_ReadCalibrated(); float voltage (float)raw * (4.096f / 32768.0f); sum voltage; } float measured_avg sum / samples; ads1115_gain reference_voltage / measured_avg; } float ADS1115_ReadVoltage(void) { int16_t raw ADS1115_ReadCalibrated(); float voltage (float)raw * (4.096f / 32768.0f); return voltage * ads1115_gain; }逻辑说明增益校准的原理是测量实际比例用已知基准电压除以实测电压得到修正系数。这个系数对所有量程都有效因为增益误差主要是基准源的偏移基准不准会导致所有量程的读数都按同一个比例偏差。校准后测量的电压乘上这个系数就修正回来了。参数说明reference_voltage 必须以实际输出为准不要相信标称值。比如用 2.048V 基准源先用万用表实测是 2.050V 就用 2.050 参与计算。量程常数 4.096f 对应 PGA 设为 ±4.096V 的情况如果换量程要同步改。增益校准和偏移校准按顺序执行先做偏移再做增益增益系数计算时使用的读数必须是偏移修正后的值。5.3 数据平滑滑动平均滤波压制工频干扰ADS1115 的 ΔΣ 调制器对工频干扰有一定抑制能力但数据速率设置在 128 SPS 以上时50Hz 工频的衰减有限。实际采集交流供电环境的传感器信号读数里能明显看到 50Hz 的纹波。简单有效的手段是滑动平均滤波窗口取 16 或 32 个样本能显著压制周期性干扰。#define FILTER_WINDOW 16 float filter_buf[FILTER_WINDOW]; uint8_t filter_index 0; float filter_sum 0.0f; float ADS1115_ReadFiltered(void) { filter_sum - filter_buf[filter_index]; filter_buf[filter_index] ADS1115_ReadVoltage(); filter_sum filter_buf[filter_index]; filter_index (filter_index 1) % FILTER_WINDOW; return filter_sum / FILTER_WINDOW; }逻辑说明滑动平均滤波器的本质是维护一个固定长度的窗口每来一个新样本就丢弃最旧的样本窗口内所有值的均值就是输出。这个实现用了环形缓冲区不需要每次重新求和计算量很小在 STM32F103 上完全不是负担。参数说明窗口长度 16 对应 128 SPS 数据速率时约 125ms 的时间常数能平滑大部分工频纹波。窗口太长会导致响应变慢采集快速变化的信号时反而失真。实际项目中如果信号本身就稳定窗口可以设大一点如果是动态信号建议别超过 8。另外滤波后的数据用于闭环控制时要考虑相位延迟必要时做个一阶补偿。6. 验证驱动的三个手段示波器抓时序、寄存器回读和电压对比测试6.1 用逻辑分析仪抓 I2C 时序确认地址和寄存器字节驱动写完先别急着接传感器直接用逻辑分析仪抓波形是最快的验证方式。重点看三处起始信号后的设备地址是不是 0x48 加写位Config 寄存器的两个字节是否跟预期配置字一致读操作时的设备地址是不是 0x49 加读位。只要这三处对上了I2C 通信链路就是通的。逻辑分析仪的采样率设 1MHz 以上触发条件设成下降沿触发 SDA一次就能抓到完整通信帧。6.2 寄存器回读自检写什么读什么才算初始化成功一个零依赖的验证方法是回读 Config 寄存器把写入的配置原封不动读回来对比。如果读回来的字节跟写入的不一致说明通信链路有数据错位或者地址设错了。代码实现上就是在初始化函数里加一个校验uint8_t ADS1115_VerifyConfig(void) { I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x01); I2C_Stop(); I2C_Start(); I2C_SendByte((ADS1115_I2C_ADDR 1) | 0x01); uint8_t hi I2C_ReadByte(1); uint8_t lo I2C_ReadByte(0); I2C_Stop(); if (hi config_high lo config_low) { return 1; // 配置成功 } return 0; }逻辑说明这个函数把 Config 寄存器的内容读回来跟预期的配置字做逐字节对比。因为 Config 寄存器是只读位段和读写位段的混合体读回唯一能验证的就是写入的值是否被正确接收。如果返回 0重点检查 I2C 地址和设备是否在线。6.3 电压对比测试万用表读数和 ADC 读数要能对上最后一步是实测对比。给 ADC 输入一个已知电压用四位半万用表量实际值然后看 ADC 换算出来的电压。偏差在 ±0.5% 以内说明驱动和硬件都正常如果偏差超过 1%优先检查 PGA 量程设置是否正确再看电源纹波是否过大。从那次做某跨平台系统的采集模块开始我每次写完 ADS1115 驱动都会强制跑一遍这个三步验证流程逻辑分析仪确认时序、寄存器回读确认配置、万用表对比确认精度三个都过了才敢往下做应用层。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Mac安装Homebrew避坑指南:M1/M2/M3与Intel双路径实操

Mac安装Homebrew避坑指南:M1/M2/M3与Intel双路径实操

1. 为什么Mac上装个brew还能踩坑?这根本不是“一键安装”的事你搜“Mac安装brew”,页面上全是“一行命令搞定”“5分钟速成”“新手必看”。我信了,真信了——2020年那会儿,我在三台不同配置的Mac上反复重装了7次,从ma…

2026/10/15 14:46:16 阅读更多 →
Smartbi报表设置文档实战:参数联动、单元格扩展与性能调优

Smartbi报表设置文档实战:参数联动、单元格扩展与性能调优

简介:这份Smartbi报表设置文档面向使用Smartbi进行报表开发的数据分析与报表设计人员,帮助解决从模板引用到预览发布全流程中的配置与样式难题。资源包内含1个docx文件,约1.05MB,以图文步骤与代码片段结合的方式组织内容。文档围绕…

2026/10/15 14:46:16 阅读更多 →
Python+Pytest接口自动化测试框架实战解析

Python+Pytest接口自动化测试框架实战解析

1. 项目概述 这个PythonPytest接口自动化测试框架是我在金融支付系统测试工作中沉淀下来的实战方案。过去三年里,它已经执行了超过20万次接口测试,覆盖了从简单HTTP接口到复杂加密签名的各类场景。相比市面上那些花哨的测试工具,这套框架最大…

2026/10/15 14:45:12 阅读更多 →

最新新闻

北航何静:Codex调用SketchUp实操,常见智能体均适用

北航何静:Codex调用SketchUp实操,常见智能体均适用

北京航空航天大学副教授何静实测 AI 智能体驱动 SketchUp 草图大师自动建模,覆盖 ChatGPT、Claude Code、Workbuddy、OpenClaw 多款智能体,对比 4 种建模实现路径,完成多类型建筑场景建模与迭代修改。实测场景:现代住宅、10 层玻璃…

2026/10/15 19:23:17 阅读更多 →
基于Qt的TCP/UDP网络调试助手:原理、架构与实战避坑

基于Qt的TCP/UDP网络调试助手:原理、架构与实战避坑

简介:Qt 网络调试助手是一份面向嵌入式与上位机开发者的完整源码包。在旧版基础上对全部代码重写,整合 TCP 服务端、TCP 客户端、UDP 服务端、UDP 客户端四种模式,并实现十六进制与 ASCII 收发、定时器自动发送、界面配置持久化、常用发送数据…

2026/10/15 19:23:17 阅读更多 →
从零开始的C语言学习总结与规划

从零开始的C语言学习总结与规划

一、自我介绍我选择C语言作为编程入门语言,是因为它语法简洁、贴近底层,能够帮助我建立扎实的计算机基础。虽然学习过程中会遇到一些困难,比如指针、内存管理等概念,但我相信通过持续练习和积累,一定能够逐步攻克这些难…

2026/10/15 19:23:17 阅读更多 →
3MB 的 Windows 极简待办工具,免登录也能高效规划每一天

3MB 的 Windows 极简待办工具,免登录也能高效规划每一天

你有没有发现,越是复杂的待办软件,越容易变成“摆烂软件”? 最开始我们只是想腾开脑袋容量,把重要的事随手记下来,防止忘事。但很多待办软件一上来就要注册、登录、云同步,甚至设置付费墙,还没开…

2026/10/15 19:23:17 阅读更多 →
建材服务能力升级的行业观察:从客户视角看专业培训的必要性

建材服务能力升级的行业观察:从客户视角看专业培训的必要性

摘要建材采购与普通消费品采购存在本质区别。一个装修项目涉及水电管材、防水涂料、瓷砖胶、板材龙骨等数十个品类,每个品类又有不同的品牌、规格、型号和执行标准。采购周期长、异常情况多、施工场景复杂,客户在采购过程中面临的问题,往往不…

2026/10/15 19:23:17 阅读更多 →
Claude Code插件加载机制与手动安装排错指南

Claude Code插件加载机制与手动安装排错指南

1. 从"官方插件仓库"这个信号说起:Claude Code 的插件体系到底在解决什么问题第一次看到claude-plugins-official这个仓库名的时候,我的直觉是:官方终于把插件这件事从"社区各自为战"收拢到"有一个统一入口"了…

2026/10/15 19:22:17 阅读更多 →

日新闻

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 阅读更多 →