单片机串口收发数据不可靠--用做指令会执行错误动作

单片机串口通信里最常见、最头疼的问题之一:发送端发出去的数据 ≠ 接收端收到的数据,一旦用来当指令,就会执行错误动作。


1. 为何不一样

串口(UART)本身是不可靠通信,没有纠错、没有重发。出现错误的常见原因:

  1. **电平干扰:**电机、继电器、电源噪声、线太长,都会把 0 变成 1、1 变成 0。

  2. **波特率不匹配 / 时钟偏差:**两个单片机晶振精度不一样,时间久了就错位,直接乱码。

  3. **起始位、停止位出错;**一个位错,整帧数据就废了。

  4. **缓冲区溢出:**发送太快、接收来不及处理,数据直接丢失或错位。

结果就是:你发 0x01(开灯),收到可能是 0x110x00 甚至乱码,单片机就会执行错误指令


2. 实际工程如何避免

不直接裸传指令,必须加校验和保护

常用方案(从简单到实用):

① 简单校验:奇偶校验

单片机硬件自带,能检出单 bit 错误,但不能纠错,错了就丢帧。

② 和校验 / 异或校验(常用)

格式类似:帧头 + 指令 + 数据长度 + 数据 + 校验和 + 帧尾

接收端重新算一遍校验和,对不上就直接丢弃,不执行。

③ 更稳一点:CRC16/CRC32

工业常用,抗干扰强,几乎不会误判。

④ 应答机制(ACK)

  • 发送 → 等待应答
  • 收不到正确应答 → 重发
  • 多次失败 → 报错

这样就能保证:要么收到正确指令,要么不收,绝不乱执行。


3. 最关键的原则

单片机绝对不能收到什么就执行什么!

正确逻辑应该是:

  1. 接收一帧完整数据
  2. 校验通过
  3. 指令在合法列表里
  4. 再执行

否则:

  • 电机乱转
  • 继电器乱吸合
  • 加热失控
  • 甚至设备损坏、危险

4. 总结

  • 裸奔串口确实会传错,指令会乱。
  • 裸奔串口(不加校验)只能用在不危险、不重要的场合。
  • 工业 / 控制场景必须:帧结构 + 校验 + 合法指令判断
相关推荐
振浩微433射频芯片2 小时前
从门锁到考勤,VRC522B如何在近场读卡场景中“稳坐C位”?
网络·人工智能·单片机·物联网
Groundwork Explorer14 小时前
W5500 网卡编程初始化与使用指南
python·单片机
智闲电子设计16 小时前
STM32 SD 卡 + FatFS 实战:掉电丢数据?f_sync 和簇对齐写救你
stm32·单片机·嵌入式硬件
ヾChen17 小时前
ESP32 OTA 踩坑实录
stm32·单片机·嵌入式硬件·物联网·学习
DevHub18 小时前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
小僧景贤18 小时前
嵌入式ADC高阶深度解析:基于STM32底层原理、误差溯源、硬件调校与工业级落地
单片机·嵌入式硬件·stm32 adc·工业级高精度采集·adc 误差校准·量产固件开发
黑猫学长呀18 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
雨田言炎19 小时前
STM32专题之内部FLASH详解
笔记·stm32·单片机
Be for thing21 小时前
【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战
单片机·嵌入式硬件·学习
郎哥编程课堂21 小时前
单片机零基础训练营第2天:嵌入式开发常用的三种进制
单片机·嵌入式硬件