单片机串口收发数据不可靠--用做指令会执行错误动作
单片机串口通信里最常见、最头疼的问题之一发送端发出去的数据 ≠ 接收端收到的数据一旦用来当指令就会执行错误动作。1. 为何不一样串口UART本身是不可靠通信没有纠错、没有重发。出现错误的常见原因电平干扰电机、继电器、电源噪声、线太长都会把 0 变成 1、1 变成 0。波特率不匹配 / 时钟偏差两个单片机晶振精度不一样时间久了就错位直接乱码。起始位、停止位出错一个位错整帧数据就废了。缓冲区溢出发送太快、接收来不及处理数据直接丢失或错位。结果就是你发0x01开灯收到可能是0x11、0x00甚至乱码单片机就会执行错误指令。2. 实际工程如何避免不直接裸传指令必须加校验和保护。常用方案从简单到实用① 简单校验奇偶校验单片机硬件自带能检出单 bit 错误但不能纠错错了就丢帧。② 和校验 / 异或校验常用格式类似帧头 指令 数据长度 数据 校验和 帧尾接收端重新算一遍校验和对不上就直接丢弃不执行。③ 更稳一点CRC16/CRC32工业常用抗干扰强几乎不会误判。④ 应答机制ACK发送 → 等待应答收不到正确应答 → 重发多次失败 → 报错这样就能保证要么收到正确指令要么不收绝不乱执行。3. 最关键的原则单片机绝对不能收到什么就执行什么正确逻辑应该是接收一帧完整数据校验通过指令在合法列表里再执行否则电机乱转继电器乱吸合加热失控甚至设备损坏、危险4. 总结裸奔串口确实会传错指令会乱。裸奔串口不加校验只能用在不危险、不重要的场合。工业 / 控制场景必须帧结构 校验 合法指令判断。