
一、通信协议概述
1. 默认通信参数
2. CRC 校验
- 算法:CRC-16/Modbus(多项式
0x8005
) - 校验码格式:2 字节,高位在前(如
CRC_H CRC_L
)。 - 计算工具:参考 CRCTool 或规格书第 IX 章代码。
二、协议功能详解
1. 读取设备地址和固件版本
功能:获取当前设备地址和固件版本号。
请求格式(主机→传感器)
字节位置 | 数据 | 说明 |
---|---|---|
0 | 0xFE | 广播地址(所有设备响应) |
1 | 0x11 | 功能码(读取地址) |
2-5 | 0x00 | 固定填充 |
6-7 | CRC | CRC 校验码 |
示例命令:
FE 11 00 00 00 01 28 06
响应格式(传感器→主机)
字节位置 | 数据 | 说明 |
---|---|---|
0 | 0x01 | 设备地址 |
1 | 0x11 | 功能码 |
2 | 0x02 | 数据长度(2 字节) |
3 | 0x12 | 固件版本(如 0x12=V1.2 ) |
4 | 0x01 | 当前地址 |
5-6 | CRC | CRC 校验码 |
示例响应:
01 11 02 12 01 70 5C
解析:
- 固件版本:
V1.2
- 设备地址:
0x01
2. 修改设备地址
功能:更改设备 Modbus 地址(范围 1~247
)。
请求格式(主机→传感器)
字节位置 | 数据 | 说明 |
---|---|---|
0 | 当前地址 | 原地址(如 0x01 ) |
1 | 0x06 | 功能码(修改地址) |
2-4 | 0x00 | 固定填充 |
5 | 新地址 | 目标地址(如 0x02 ) |
6-7 | CRC | CRC 校验码 |
示例命令(修改地址为 0x02
):
01 06 00 00 00 02 08 0B
响应格式(传感器→主机)
与请求格式一致,返回修改后的地址确认。
示例响应:
01 06 00 00 00 02 08 0B
说明:响应数据与请求相同表示修改成功。
3. 读取传感器数据
功能:读取指定寄存器的传感器数据(支持单次读取多个传感器)。
请求格式(主机→传感器)
字节位置 | 数据 | 说明 |
---|---|---|
0 | 设备地址 | 如 0x01 |
1 | 0x03 | 功能码(读取数据) |
2-3 | 起始地址 | 寄存器起始地址(高位在前) |
4-5 | 寄存器数量 | 需读取的寄存器数量 |
6-7 | CRC | CRC 校验码 |
示例命令(读取全部 11 个传感器数据):
01 03 00 00 00 0B C5 CD
响应格式(传感器→主机)
字节位置 | 数据 | 说明 |
---|---|---|
0 | 设备地址 | 如 0x01 |
1 | 0x03 | 功能码 |
2 | 数据长度 | 字节数(寄存器数量 × 2) |
3~N | 传感器数据 | 每个寄存器 2 字节(高位在前) |
N+1~N+2 | CRC | CRC 校验码 |
示例响应(部分数据):
01 03 16 00 96 00 64 00 32 00 30 00 28 00 1E 01 2C 00 0A 00 14 70 5C
解析:
00 96
→ eCO₂ = 150 ppm00 64
→ TVOC = 100 ppb00 32
→ CH₂O = 50 μg/m³- 温湿度数据:
- 湿度:
0x012C
→ 300 → 300/100 = 30.0%RH - 温度:
0x000A
→ 10 → 10/100 = 0.10℃
4. 系统参数配置(高级功能)
4.1 读取/设置波特率
寄存器地址:0x0103
(波特率代码见附录表)。
读取波特率请求:
01 03 01 03 00 01 CRC
设置波特率请求(设为 115200):
01 06 01 03 00 07 CRC
4.2 校准传感器数据
寄存器地址:
- 温度校准:
0x011D
- 湿度校准:
0x011C
示例命令(温度校准 +2.5℃):
01 06 01 1D 00 FA 98 73
说明:
00 FA
→ 250(即 250/100 = 2.5℃)- 负值需转换为补码(如
0xFF9C
→ -100 → -1.00℃)。
三、数据解析方法
1. 计算公式
传感器类型 | 公式 | 示例 |
---|---|---|
eCO₂ | CO₂ = (CO₂_H << 8) + CO₂_L | 0x0096 → 150 ppm |
温度 | 温度 = 有符号值 / 100 | 0xFF9C → -100 → -1.00℃ |
光照度 | Lux = (Lux_H << 8) + Lux_L | 0x01F4 → 500 Lux |
2. 有符号数处理
- 方法 1:直接转为有符号整数(如
0xFF9C
→ -100)。 - 方法 2:若值 > 32767,则
真实值 = (原始值 - 65536) / 100
。
四、注意事项
- 预热时间:VOC 模块需预热 ≥3 分钟,其他传感器上电即用。
- 安装要求:
- 安装高度 ≥15cm,避免地面尘埃污染。
- 避免高粉尘(>300 μg/m³)、油烟或高湿度环境。
- 校准警告:
- 高级功能需谨慎操作,误修改可能导致数据异常。
- 校准值需按实际环境调整,建议记录出厂默认值。
- CRC 校验:所有命令必须包含正确 CRC,否则设备无响应。
五、附录
1. 传感器寄存器地址表
寄存器地址 | 传感器类型 | 数据格式 |
---|---|---|
0x0000 | eCO₂ | 2 字节无符号整数(ppm) |
0x0001 | TVOC | 2 字节无符号整数(ppb) |
0x0002 | CH₂O | 2 字节无符号整数(μg/m³) |
0x0003 | PM2.5 | 2 字节无符号整数(μg/m³) |
0x0004 | 湿度 | 2 字节(真实值 × 100) |
0x0005 | 温度 | 2 字节(真实值 × 100) |
0x0006 | PM10 | 2 字节无符号整数(μg/m³) |
0x0007 | PM1.0 | 2 字节无符号整数(μg/m³) |
0x0008 | 光照度 | 2 字节无符号整数(Lux) |
0x0009 | MCU 温度 | 2 字节(真实值 × 100) |
0x000A | 噪声 | 2 字节无符号整数(dB) |
2. 波特率代码表
代码 | 波特率 |
---|---|
0 | 1200 |
1 | 2400 |
2 | 4800 |
3 | 9600 |
4 | 19200 |
5 | 38400 |
6 | 57600 |
7 | 115200 |
3. CRC 计算代码(C 语言示例)
uint16_t CRC16_Check(const uint8_t *pushMsg, uint8_t usDataLen) {
uint8_t uchCRCHi = 0xFF, uchCRCLo = 0xFF;
uint8_t uIndex;
while (usDataLen--) {
uIndex = uchCRCLo ^ *pushMsg++;
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex];
uchCRCHi = auchCRCLo[uIndex];
}
return (uint16_t)(uchCRCHi << 8 | uchCRCLo);
}