基于STM32L4的SDI-12协议实现问题咨询
SDI-12协议实现问题解答
背景
我正尝试在STM32L4微控制器上通过UART5及RAK13010模块的buffer(含信号电平转换)实现SDI-12协议,制作UART转SDI-12单线转换器,但无法与SDI-12兼容传感器通信,怀疑输出数据存在问题。根据SDI-12协议datasheet中的示波器输出图(picture_1),发送“0!”命令时的波形我无法解码出二进制序列,且我的实现输出(picture_2)除break和marking事件外与datasheet波形不符。协议要求的UART参数为:1) 波特率1200,2) 1个停止位,3) 偶校验,4) 1个起始位。
问题1:datasheet中picture_1的示波器输出对应的二进制序列是什么?我需以此验证输出数据是否为逆序。
SDI-12遵循UARTLSB(最低有效位)优先的传输规则,结合协议参数,可拆解“0!”两个字符的传输序列:
- 字符“0”的ASCII码为
0x30(二进制00110000),传输顺序为:起始位(0) → 0(LSB) → 0 → 0 → 0 → 1 → 1 → 0 → 0(MSB) → 偶校验位(数据位1的个数为2,偶校验位为0)→ 停止位(1) - 字符“!”的ASCII码为
0x21(二进制00100001),传输顺序为:起始位(0) → 1(LSB) → 0 → 0 → 0 → 0 → 1 → 0 → 0(MSB) → 偶校验位(数据位1的个数为2,偶校验位为0)→ 停止位(1)
你可以按1200波特率计算单比特时长(约833μs),对照示波器波形的电平持续时间,匹配上述序列即可验证是否存在比特顺序错误。
问题2:部分SDI-12 datasheet指出数据需逆序,部分未提及,实际要求是什么?
SDI-12协议强制要求LSB优先传输,这是异步UART的默认传输规则,部分文档明确标注是为了避免误解,部分则默认开发者了解UART基础特性。你无需手动做比特逆序操作,只要保持STM32 UART的默认LSB优先配置即可,手动逆序反而会导致传输错误。
问题3:某技术文档未指定marking事件,但其他文档要求break事件后必须有marking事件,实际规范是怎样的?
根据SDI-12官方规范(ANSI/ISA SDI-12-2018),Break事件后必须紧跟Marking事件:
- Break事件:持续至少12ms的低电平(等效14个1200波特率比特时长),用于唤醒传感器
- Marking事件:Break结束后,必须发送至少1ms的高电平(等效1.2个比特时长),作为协议要求的同步间隔,确保传感器正确识别后续命令字符
部分简化文档可能省略该细节,但官方规范为强制要求,缺少Marking事件会导致传感器无法正确检测Break后的命令起始位,进而通信失败。
内容的提问来源于stack exchange,提问作者ngrigoriadis
相关产品推荐
相关产品推荐

