STC8A单片机驱动SHT30温湿度传感器:I2C时序与串口显示全解析 简介本资源是一套面向嵌入式初学者与单片机开发者的STC8A单片机实战例程聚焦SHT30高精度数字温湿度传感器的I²C通信与数据可视化应用。通过完整C51源码实现STC8A对SHT30的初始化、测量指令发送、4字节原始数据读取、温湿度数值解算摄氏度/百分比及UART串口格式化输出最终在串口助手中实时显示覆盖硬件驱动、协议解析、浮点运算与人机交互等关键环节。压缩包共18个文件含5个核心C源文件i2c.c、sht30.c、uart.c、delay.c、main.c、5个对应头文件含STC8.H、Keil工程文件uvproj/uvgui/uvopt、编译输出hex/m51及SHT30技术资料RAR总大小1.27MB结构规范便于工程导入与代码溯源。已有241人学习下载提供可直接烧录运行的完整软硬件协同方案包含I²C时序容错处理、UART波特率配置说明与数据转换逻辑注释是掌握STC8A外设驱动与传感器集成的优质实践素材。 这款例程源码是我在实际开发中经常拿来即用的一套组合STC8A系列单片机 SHT30数字温湿度传感器 串口助手可视化显示。很多刚接触单片机开发的朋友拿到SHT30的例程第一反应往往是头大——I2C时序、CRC校验、温湿度换算公式一堆概念堆在一起。但实际上当你把STC8A这颗增强型51内核的单片机跟SHT30这颗数字传感器搭配使用时整个开发难度会比你想象中低很多前提是你真正理解了底层那套通信逻辑。这篇文章我就结合这份例程源码把从硬件接线到串口显示的全流程拆开来讲包括那些文档里不会写、但你实际调试时一定会踩的坑。这套方案解决了什么实际问题就是两个字取数。SHT30内部集成了传感单元和信号处理电路通过I2C总线直接把校准后的温湿度数据送出来单片机只需要按照协议发一条测量命令再读回6个字节数据经过换算就是温度湿度。比起传统的模拟量传感器比如DHT11的时序模拟、热敏电阻的ADC采样加查表这种方式精度高、代码量小、稳定性好非常适合做环境监测、冷链运输记录仪、小型气象站这类项目。适合谁看正在做课程设计、电子设计竞赛或者刚接触I2C通信想找一份能直接跑通的参考代码的开发者这篇文章都能帮上忙。我会带你逐段过一遍源码的核心逻辑再把我在实际调板过程中遇到的几个经典问题整理出来。1. 方案选型为什么是STC8A搭配SHT301.1 STC8A这颗芯片到底强在哪STC8A系列是STC公司推出的增强型8051内核单片机我最早用的是STC8A8K64S4A12这颗料64K Flash、8K SRAM频率最高能跑到24MHz这个性能在传统51家族里已经属于相当能打的水平。最关键的还不是这些纸面参数而是STC8A的指令周期从传统51的12T压缩到了1T也就是说同样的晶振频率下CPU执行速度直接翻了12倍——写I2C时序的时候延时参数的调整空间就大了很多不像老51那样动不动就卡时序。更重要的是STC8A内部集成了硬件I2C模块这是跟传统51软件模拟I2C拉开差距的核心点。软件模拟I2C需要自己拉高拉低SCL和SDA引脚还要严格凑时序一旦被中断打断就容易出错而硬件I2C由外设自动产生时序信号CPU只需要操作几个寄存器既省心又稳定。不过这里产生了一个有意思的现象我手上这份例程源码用的是GPIO软件模拟I2C而不是单片机自带的硬件I2C。为什么原因很简单——软件模拟的移植性极强这套代码你拿到STC8A上能跑换成STM32、换成AT89C52照样能跑只改个引脚定义就行。对于学习理解I2C协议本质来说软件模拟反而是更好的教材。顺带说一句STC8A的IO口可以配置为准双向模式因为I2C协议本身是开漏结构SDA和SCL都需要上拉电阻。STC8A内部虽然没有上拉电阻但好在它的IO口支持强推挽输出所以在软件模拟的时候直接推挽输出也能正常工作。很多人在这一步会犯迷糊觉得“开漏模式接上拉”才是标准做法然后到处找上拉电阻。其实在短距离通信同一个板子内部走线不超过10cm的场景下推挽输出软件模拟I2C完全可行我实测过多次没问题。1.2 SHT30传感器跟SHT31/SHT35怎么选SHT30是Sensirion盛思锐公司的一款数字温湿度传感器I2C接口精度上温度典型值±0.3°C湿度典型值±2%RH。它上面还有两个更高端的兄弟SHT31和SHT35精度分别提升到±0.2°C和±0.1°C。价格依次递增日常环境监测场景用SHT30完全够用。SHT30跟常见的DHT11相比优势明显。DHT11精度是±2°C和±5%RH而且响应慢、不能连续读取太频繁SHT30不仅精度高了一个档次还内置了加热器可以除凝露、周期测量模式、报警功能。最重要的是SHT30的数据输出是经过温度补偿的在0-60°C范围内线性度很好直接用公式换算即可不需要做多点标定。从软件角度看SHT30最友好的地方在于它内部自带AD转换和校准算法单片机拿到的是数字量。你不需要关心电压-温度曲线、不需要自己搭放大电路、不需要查表读回来的数据经过一个固定的线性换算就能得到物理量。这对代码维护来说是巨大的解放也是数字传感器相比模拟传感器最本质的差异。2. I2C通信协议核心逻辑与SHT30命令时序2.1 I2C总线怎么工作的I2C总线就是一根时钟线SCL加一根数据线SDA所有设备都挂在这两根线上通过设备地址来区分谁跟谁通信。SHT30的7位I2C地址取决于ADDR引脚的电平ADDR接低电平或悬空因为内部有下拉地址是0x44ADDR接高电平地址是0x45。这个地址是整个通信过程中的关键发命令、读数据都要用到。I2C通信的一个完整事务包含这么几个阶段主机发送起始信号STARTSCL为高电平时SDA从高拉低。主机发送设备地址读写位8位数据其中高7位是地址最低位是读写位0表示写1表示读。从机应答ACK从机拉低SDA表示收到。数据收发数据在SCL高电平时保持稳定低电平时允许变化。停止信号STOPSCL为高电平时SDA从低拉高。这套流程我再打个比方I2C总线就像一条单车道的小路起始信号相当于按了喇叭提醒所有设备“我要发消息了”设备地址相当于喊了一个人的名字被喊到的人回应一声“到”ACK然后双方开始说话说完了按个喇叭表示结束。同一时刻这条路上只允许一对设备通信其他设备保持沉默。2.2 SHT30的关键命令字与数据帧格式SHT30支持多条命令但在例程里最常用的是单次数据采集模式下的高重复性测量命令。我用的命令帧是0x2C 0x06其中0x2C表示“单次测量模式”0x06表示“高重复性”。高重复性意味着传感器内部做更多次的采样平均精度表现更好代价是转换时间稍长需要等待约15ms。如果你想用中重复性或低重复性命令字分别对应0x2C 0x0D和0x2C 0x14转换时间依次缩短但噪声也相应增大。发送完测量命令后主机需要等待一小段时间代码中通常延时20-30ms然后发起读操作。SHT30会返回6个字节的数据包温度高字节 温度低字节 CRC校验 湿度高字节 湿度低字节 CRC校验前两个字节是16位温度原始值第三个字节是它的CRC校验码后两个字节是16位湿度原始值第六个字节是它的CRC校验码。把这个结构跟其他I2C传感器对比一下就能发现SHT30的好处是连校验都帮你设计好了不需要额外封装协议我们只需要在单片机里实现对应的CRC校验函数就行。2.3 温湿度换算公式原始值怎么变成物理量拿到16位原始值以后换算公式非常直接温度°C -45 175 × 温度原始值 / 65535湿度%RH 100 × 湿度原始值 / 65535举个例子假设读回来的温度原始值是0x6A24换成十进制是27172那么温度 -45 175 × (27172 / 65535) ≈ -45 72.53 ≈ 27.53°C。湿度原始值是0x570E十进制是22286那么湿度 100 × (22286 / 65535) ≈ 34.0%RH。这里有个很多人踩过的坑0x6A24是16位无符号数在8位单片机上计算时一定要用unsigned int类型千万别错用成int。int在8051上是16位有符号数最大只能表示32767如果温度原始值超过这个数比如高温环境下确实可能超过就会变成负数算出来的温度完全不对。单片机做浮点运算比较慢我一般会先算成定点数再转浮点或者直接放大100倍输出整数比如输出2753表示27.53°C这样在串口助手上显示更直观也省了MCU的浮点运算开销。2.4 软件模拟I2C的时序参数细节软件模拟I2C的核心就是延时控制。SCL高电平保持时间和低电平保持时间都有最低要求标准模式下SCL时钟频率最高100kHz快速模式400kHz。STC8A跑24MHz主频时一个NOP大约0.04微秒写延时函数时通常用几微秒的精调就能满足时序。我在例程里看到的是这种写法每次SDA电平变化后加一个短延时每次SCL翻转后也加一个短延时。虽然看起来松散但实测在100kHz级别完全没问题。需要注意的是I2C协议里SDA的电平变化必须发生在SCL低电平时段如果SCL高电平时SDA突然变化会被从机认成起始或停止信号通信就乱了。所以调时序的时候宁可延时多一点也不要把SDA的变化跟SCL高电平重叠。3. 核心代码逐段解析与串口显示实现3.1 引脚定义与I2C初始化我手头这份例程的引脚分配是SCL - P2.0SDA - P2.1这两个引脚可以在头文件里统一宏定义方便后续换板子时快速修改。初始化部分把这两个引脚配置为准双向IO模式同时把SDA和SCL都拉高进入空闲状态。#define SCL P20 #define SDA P21 void I2C_Init(void) { SCL 1; SDA 1; }这段代码只有两行但它的意义在于让总线进入空闲态。I2C总线的空闲状态是SCL和SDA都为高很多初学者上来就发起始信号忽略了释放总线这个动作结果从机根本没有进入正常监听状态。3.2 起始、停止、发送字节、接收字节四个基础函数I2C软件模拟最核心的就是四个函数起始信号、停止信号、发送一个字节同时读取ACK、接收一个字节同时发送ACK或NACK。这四个函数是所有I2C通信的地基我做项目时一般在工程里单独建一个i2c.c文件把这几个函数放进去整个项目复用。起始信号的代码void I2C_Start(void) { SDA 1; SCL 1; delay_us(5); SDA 0; delay_us(5); SCL 0; }逻辑很简单SDA和SCL先都是高然后把SDA拉低此刻总线进入起始状态最后SCL拉低准备后续数据位。这里要求SDA拉低时SCL必须保持高电平这是I2C协议层面的规定不是代码风格问题。发送一个字节的代码void I2C_SendByte(unsigned char dat) { unsigned char i; for (i 0; i 8; i) { if (dat 0x80) SDA 1; else SDA 0; dat 1; SCL 1; delay_us(2); SCL 0; delay_us(2); } }这里需要注意的是数据的发送顺序高位在前MSB first所以每次判断当前最高位然后左移一位。SCL拉高时从机采样SDASCL拉低时主机改变SDA。这个节奏很重要如果SCL拉低和SDA变化之间没有间隔可能会导致从机采样到错误电平。3.3 SHT30的启动测量与数据读取先来看启动测量函数。它的任务是发送设备地址写方向、发送0x2C命令、发送0x06高重复性参数void SHT30_StartMeasure(void) { I2C_Start(); I2C_SendByte(0x44 1 | 0); // 设备地址写位 I2C_WaitAck(); I2C_SendByte(0x2C); // 单次测量命令 I2C_WaitAck(); I2C_SendByte(0x06); // 高重复性 I2C_WaitAck(); I2C_Stop(); delay_ms(20); // 等待测量完成 }注意这里0x44 1 | 0这个表达式0x44是7位地址左移一位后变成8位地址最低位是0表示写操作。很多新手会把0x44直接当成8位地址发出去结果从机根本不回应。这算I2C协议里最经典的出错点之一。读取数据的函数有些不一样因为要包括一个“重复起始信号”的过程。SHT30的读取流程要求主机发送设备地址读方向时要先发送一个重复起始信号相当于告诉从机“测量完成了把数据给我”。完整读6个字节unsigned char SHT30_ReadData(unsigned char *buf) { unsigned char i; I2C_Start(); I2C_SendByte(0x44 1 | 1); // 设备地址读位 I2C_WaitAck(); for (i 0; i 6; i) { if (i ! 5) buf[i] I2C_RecvByte(1); // 发送ACK else buf[i] I2C_RecvByte(0); // 最后一个字节发送NACK } I2C_Stop(); }这里最后一个字节要回NACK而不是ACK原因是主机如果回了ACK从机会认为主机还想继续接收数据就不会释放SDA停不下来。只有回了NACK从机才会明白数据发完了把总线交给主机。这个细节很多文档会提到但很容易被忽略。3.4 CRC校验的实现思路SHT30读取回来的6个字节中第2和第5个字节分别是温度、湿度的CRC校验码。CRC算法是CRC-8多项式是x^8 x^5 x^4 1即0x31初始值为0xFF。真值表法查表法和逐位运算是两种常见实现逐位运算代码量小查表法速度快。在STC8A这样的1T单片机上逐位运算已经很快了所以例程里用的逐位运算是很合理的选择。unsigned char SHT30_CheckCRC(unsigned char *data, unsigned char len) { unsigned char crc 0xFF; unsigned char i, j; for (i 0; i len; i) { crc ^ data[i]; for (j 0; j 8; j) { if (crc 0x80) crc (crc 1) ^ 0x31; else crc 1; } } return crc; }计算出来如果等于传感器返回的CRC字节说明数据传输无误如果不一致说明通信过程受到了干扰可以丢弃本次数据等下一次采样。这是做工业级产品必须加的步骤。很多开发者为了省代码量跳过了CRC校验结果现场总线一长数据偶尔跳变找半天找不到原因最后发现是校验没做。我的经验是校验不能省这是数字传感器的核心优势。3.5 串口初始化与数据格式化输出STC8A内置了多个串口例程里用的是串口1。串口初始化的流程是设置波特率发生器定时器1或定时器2、配置串口模式8位UART、可变波特率、使能发送和接收。波特率9600是串口助手最常用的8051系列用定时器1做波特率发生器时计算公式是波特率 (2^SMOD / 32) × (定时器溢出频率)我用的是STC8A的定时器2做波特率发生器因为定时器2是16位自动重装精度比定时器1高。代码里直接配置void UART1_Init(unsigned int baud) { SCON 0x50; // 8位数据、允许接收 AUXR | 0x01; // 定时器2作为波特率发生器 AUXR | 0x04; // 定时器2不分频 T2L (65536 - FOSC / 4 / baud) 0xFF; T2H (65536 - FOSC / 4 / baud) 8; ES 1; EA 1; }注意这里的FOSC是系统主频。如果主频是24MHz波特率9600那么65536 - 24000000 / 4 / 9600 65536 - 625 64911。这个值算出来以后赋给T2L和T2H就是初值。如果你改了主频但忘了改这个宏定义串口输出的波形就会完全乱掉这是最常见的串口数据乱码原因。发送一个字节的代码void UART1_SendByte(unsigned char dat) { SBUF dat; while (!TI); TI 0; }实际在例程里我看到的输出格式不只是单纯发送原始数据而是用sprintf格式化后通过串口输出。但这里有个性能陷阱sprintf在STC8A上是可以用的因为有足够的Flash和SRAM但如果你在主循环里高频调用sprintfCPU会被吃掉不少。所以我建议只在需要显示的时候才调用sprintf比如每秒钟刷新一次不要放在高频率的采样中断里。3.6 主循环采集-换算-显示全流程主函数的逻辑通常长这样void main(void) { unsigned char buf[6]; unsigned int temp_raw, hum_raw; float temperature, humidity; UART1_Init(9600); I2C_Init(); delay_ms(100); while (1) { SHT30_StartMeasure(); SHT30_ReadData(buf); temp_raw ((unsigned int)buf[0] 8) | buf[1]; hum_raw ((unsigned int)buf[3] 8) | buf[4]; temperature -45.0 175.0 * (float)temp_raw / 65535.0; humidity 100.0 * (float)hum_raw / 65535.0; UART1_SendString(Temp: ); UART1_SendFloat(temperature, 2); UART1_SendString( C, Hum: ); UART1_SendFloat(humidity, 2); UART1_SendString( %RH\r\n); delay_ms(1000); } }主循环的节奏是每秒采集一次。这里有个重要设计点SHT30的单次测量模式适合低速周期性采集如果你需要更快的刷新率就应该改用周期测量模式命令0x2E传感器内部会自动按设定频率测量主机随时可以读取最近一次的结果。周期测量模式的功耗和刷新率有一套对应的配置例程里默认用单次测量是对的因为它功耗更低。串口显示端这串输出在串口助手里会显示成一行文本。我用过的串口助手有好几款——SSCOM、XCOM、友善串口助手、STC-ISP自带的串口助手——它们的基本功能都差不多设置好端口号和波特率9600勾选“文本模式显示”就能看到类似这样的输出Temp: 27.53 C, Hum: 34.0 %RH4. 常见问题与排查技巧实录4.1 串口没有输出或者输出乱码这个问题排在所有问题的第一位。我遇到的情况有两种一种是什么都不显示另一种是显示的全是乱码。什么都不显示先检查三样东西接线TXD/RXD有没有交叉接、共地PC和单片机之间是否共地、波特率PC端设置的波特率是否和单片机一致。9个新手有8个是波特率没对上。乱码的情况多半是主频算错了。STC8A的默认主频有内置IRC内部时钟和外部晶振两种来源。如果你代码里写的是24MHz但芯片实际跑在11.0592MHz出厂默认IRC可能是这个值那么定时器初值算出来的波特率就会偏移输出自然乱码。解决办法是确认你用的主频并保证单片机在主频改变后有足够长的延时等电源和时钟稳定后再跑串口。4.2 I2C总线卡死程序跑飞这个是I2C通信里最让人头疼的问题。现象是程序运行一段时间后卡死复位之后又正常过一会儿又卡死。排查下来多数是SDA线被从机拉死拉低了。I2C协议里有一个机制从机如果发现主机后续的时钟脉冲不够就会持续拉低SDA等待主机给出足够的SCL时钟脉冲来让它把数据发送完毕。如果主机代码里有bug导致SCL脉冲数量不够从机就会一直占住SDA低电平不放。遇到这种情况最简单有效的方法是在每个I2C事务开始前检查SDA的状态如果发现SDA一直为低就强制产生9个额外的SCL时钟脉冲让从机复位void I2C_RecoverBus(void) { unsigned char i; SCL 0; SDA 1; for (i 0; i 9; i) { SCL 1; delay_us(5); SCL 0; delay_us(5); } I2C_Start(); }这段恢复代码我在正式项目里救过我好几次。另外还有一种常见的卡死原因是主机发送起始信号后从机没有回应ACK比如地址写错了代码里又没有对ACK做判断程序继续往下执行导致后续所有时序全部错乱。所以在I2C_SendByte后面最好加一个等待ACK的函数如果没等到就不继续操作或者重发一次。4.3 温度和湿度数值明显偏大或偏小数值偏差大首先怀疑换算公式的原始值对不对。你可以在串口助手上把原始值也打出来比如“raw0x6A24”然后拿计算器自己算一遍温度确认你的换算代码没写错。其次怀疑字节拼接顺序。SHT30返回的数据是大端序高字节在前、低字节在后。如果代码写成了temp_raw (buf[1] 8) | buf[0]那算出来的值肯定是乱的。还有一坑是类型转换溢出。我之前遇到过读出来的温度在高温段变成负值就是因为用了int类型。换成unsigned int后问题立刻消失。另外(float)temp_raw / 65535.0这里一定要先做float转换再做除法否则整数除法会丢掉小数部分。4.4 读取的数据偶发跳变数据偶尔跳变一般是干扰造成的排查方向有三个电源纹波、I2C线过长、缺少CRC校验。如果你在SHT30附近放了电机或者其他感性负载建议在传感器电源引脚加一个0.1uF的旁路电容并且尽量缩短I2C线长度必要时降低I2C速率加长延时参数。如果你还没有加CRC校验现在就去加上。因为我遇到的情况是加了CRC校验之后才发现跳变的问题比想象中严重得多——大约每100次采样有2-3次CRC校验失败。之前不做校验的时候这些错误数据直接就上屏了看起来就是偶发跳变。所以最好的排查方法不是盯着数据看而是让代码告诉你通信是否可靠。4.5 串口助手显示刷新频率太高导致卡顿如果你在串口助手界面上看到的数据像瀑布一样滚动看着很爽但实际已经给单片机造成了不小的负担。我建议在主循环里加入延时控制刷新率环境监测场景每秒刷新1次就够了。如果你需要看长时间的趋势可以每10秒刷新一次或者把数据直接存到外部Flash里之后再导出分析。另外串口助手的缓冲区是有限的如果你持续高速发送数据PC端软件来不及显示数据就会被丢弃。这不算单片机的bug是串口波特率和显示速度的匹配问题。5. 例程二次开发扩展方向5.1 从单点采集到多点组网这套例程本身是单SHT30采集但SHT30只有两个地址0x44和0x45所以你最多只能挂两颗SHT30在同一总线上。如果你需要采集多个点位的温湿度可以用STC8A的两个不同IO口分别模拟两路I2C总线每路挂两个传感器这样一片单片机最多接4个传感器。再不够的话加一颗I2C多路复用器比如TCA9548A就能把传感器数量扩展到8路甚至更多。5.2 从串口显示到OLED展示串口显示只能接电脑如果你要做一个小型温湿度计摆在家里那需要把数据显示在屏幕上。最常见的扩展方案是加一块0.96寸OLED屏接口也是I2C。注意这里两个I2C设备地址不能冲突SHT30通常是0x44OLED屏通常是0x3C完全不同可以共用一组I2C引脚。这样STC8A同时操作SHT30和OLED代码结构不变只增加一个OLED驱动文件即可。另一个方案是加LCD1602但LCD1602需要8位并口或I2C转接模块占用引脚多代码也复杂除非你需要低成本方案否则我还是推荐OLED。5.3 从定时采集到阈值报警在环境监测场景里光是显示温度湿度还不够最好能设置上下限报警。比如温度超过35°C时蜂鸣器响、LED闪烁或者通过继电器控制通风扇。STC8A内置ADC和PWM可以直接驱动蜂鸣器和LED继电器需要加三极管或ULN2003驱动。这个扩展只需要在采集函数后面加一段比较逻辑十几行代码就能搞定属于性价比极高的功能增强。5.4 从主动查询到上位机命令控制串口助手的另一个玩法是双向通信。STC8A不只是往上位机发数据还可以接收上位机发下来的命令。比如上位机发送“READ_TEMP”单片机收到后返回当前温度发送“SET_ALARM35”单片机重新设置报警阈值。这需要在串口接收中断里做一个简单的状态机解析解析完成后执行对应命令。做出来以后你的项目就从“只能看”升级成了“可控制”很多竞赛项目里的“上位机监控系统”就是这个套路。实现这种双向通信时需要注意一点串口接收中断里不要做过多的数据处理只做入队操作真正的命令解析放到主循环里做。否则中断服务函数占用时间太长会影响I2C时序的稳定性。5.5 从STC8A到更高阶平台的移植这套例程的代码在STC8A上跑通了以后移植到其他平台也很快。SHT30的驱动代码I2C四函数、启动测量、读取数据、CRC校验基本不用动只需要把底层几个IO操作宏替换成目标平台的GPIO库函数。我试过把同一套SHT30驱动从STC8A移植到STM32F103改动量不超过20行主要是IO口初始化和延时函数替换。这就是软件模拟I2C带来的最大好处——硬件无关性强代码生命周期长。写在最后的一点建议这套基于STC8A和SHT30的例程我陆陆续续在不同项目里用了很多次。从最开始照着文档抄代码到后来把I2C时序彻底吃透最大的收获不是会调这个传感器了而是建立了一套排查问题的思路先确认通信时序再确认数据格式最后确认换算逻辑三个环节按顺序排查效率最高。建议你拿到例程之后不要只满足于点亮看数据按照我上面列的排查场景故意改坏几个参数看看现象是什么。比如故意把波特率改错、故意把I2C地址改掉、故意跳过CRC校验这样踩过几轮坑之后你对这套系统的理解会比看十遍文档都深刻。本文还有配套的精品资源点击获取

相关新闻

最新新闻

Anthropic Claude API连接失败与鉴权排查实战指南

Anthropic Claude API连接失败与鉴权排查实战指南

最近在做 Claude 模型应用集成时,大家应该都遇到过类似的报错:unable to connect to anthropic services、failed to connect to api.anthropic.com,甚至还会有请求被拒、API Key 失效、IP 被限制等一连串连锁问题。网上查一圈,答…

2026/8/31 2:04:27
Codex持久模式:AI编程智能体持续工作之道

Codex持久模式:AI编程智能体持续工作之道

Codex 是 OpenAI 开源的终端 AI 编程智能体,以 openai/codex 仓库对外发布,用户可以在命令行里让它阅读代码、修改文件、执行测试并提交变更。很多开发者已经把它当成日常编码工具,但真正让它从“单次问答”变成“持续干活”的关键能力&#…

2026/8/31 2:04:27
网易数据分析师校招笔试复盘:业务思维与硬核技能的双重考验

网易数据分析师校招笔试复盘:业务思维与硬核技能的双重考验

1. 网易校招数据分析师笔试复盘:一场“业务直觉硬核技能”的双重考验2023年的网易校招提前批数据分析师笔试,是我经历过的互联网大厂校招笔试里区分度最高的一场。先说结论:这场笔试和我之前刷过的、市面流传的“大厂SQL题库”完全不同。它不…

2026/8/31 2:04:27
LLM Agent工作流敏感数据保护:脱敏、权限与审计实战

LLM Agent工作流敏感数据保护:脱敏、权限与审计实战

很多人第一次把 LLM Agent 接入业务系统时,最先想到的是“模型能不能准确调用工具”,但真正在线上跑一段时间后,才会意识到另一个更致命的问题:敏感数据在 Agent 工作流里到底经过了哪些环节?有没有可能被模型当作文本…

2026/8/31 2:04:27
激光雷达与ROS2点云处理:机器人感知技术实战

激光雷达与ROS2点云处理:机器人感知技术实战

看到“速腾聚创:机器人业务已占半壁江山”这条消息时,我首先联想到的是一个非常具体的开发场景:一位准备给机器人项目做导航方案的工程师,正站在“买激光雷达还是深度相机”的十字路口。过去几年,这个选择题的标准答案…

2026/8/31 2:04:27
京东2019数据分析校招笔试复盘:核心考点与解题思路

京东2019数据分析校招笔试复盘:核心考点与解题思路

每年一到校招季,总有人拿着各个大厂的数据分析笔试题来问我该怎么准备。前两天翻移动硬盘,正好翻到一份我之前整理的京东2019校招数据分析工程师笔试复盘笔记,干脆把核心题型和解题思路重新梳理一遍,写成这篇东西。虽然不是当年的…

2026/8/31 1:59:27