核心理念:
无论底层是 I2C、SPI 还是 UART/Wi-Fi,通信的本质只有两个字——“收”与“发”。
如果收发不可靠,驱动就是空中楼阁。
核心在于:可靠的物理层传输 + 严谨的应用层解析 + 闭环的应答机制。
1. 物理层:收发的可靠性 (Reliability) —— “数据的运输线”
- 场景:I2C 总线干扰、SPI 时钟不同步、UART 波特率漂移。
- 手段:
- 超时退出:在
while等待硬件标志位(如RXNE或TXE)时,必须加入计数器或定时器超时判断,防止硬件故障导致主循环卡死。 - 状态检查:发送前检查总线是否空闲,接收后检查是否有帧错误或溢出错误。
- 超时退出:在
- 作用:确保数据在“路上”不丢包、不错位。这是驱动的基石。
2. 应用层:数据包的解包与校验 (Parsing & Validation) —— “数据的安检员”
- 场景:从 Wi-Fi/蓝牙收到的 JSON 字符串,或传感器传来的二进制流。
- 手段:
- 边界识别:通过帧头(如
{或0xAA)和帧尾(如}或0x55)锁定数据包范围。 - 字符/格式校验:对 JSON 进行语法检查,或对二进制数据进行 CRC/Checksum 校验。
- API 匹配:将解析出的指令字符串与本地命令表进行比对,过滤无效指令。
- 边界识别:通过帧头(如
- 作用:从杂乱的字节流中提取出有意义的“意图”,并过滤掉无效或错误的干扰信号。
3. 逻辑层:闭环应答机制 (Handshake & Retry)
- 场景:指令下发后,模块没反应或执行失败。
- 手段:
- ACK/NACK:接收方处理完指令后,必须回传一个确认包(成功)或错误码(失败)。
- 超时重发:发送方若在指定时间内未收到 ACK,则自动触发重发机制(通常限制最大重试次数,如 3 次)。
- 幂等性设计:为指令增加序列号 (Sequence ID),防止因网络重传导致的重复执行。
- 作用:实现“确定性”。模块控制和网络通信相通,都是通过这种握手来确保指令被准确执行。
4. 架构哲学:异步队列与协议无关性 (Asynchronous Queue)
- 削峰填谷:引入环形缓冲区 (Ring Buffer)和任务队列。
中断只负责“收”,主循环状态机负责“解包”和“排队执行”。
- 分层设计:
- 驱动层:只负责把字节发出去或收进来(不管内容是什么)。
- 解析层:负责把字节变成结构体或命令枚举。
- 业务层:只关心收到了什么命令,不关心是通过 SPI 还是 Wi-Fi 传来的。
- 作用:提高效率与稳定性。即使瞬间流量爆发,系统也能通过“排队”有序处理,避免资源爆炸。
总结:
通信接口的内核是“确定性”。
可靠的收发保证了数据能到,严谨的解析保证了数据能对,闭环的应答保证了动作能成。