尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

通信协议入门:单片机怎样把一个数字发送出去?

通信协议入门:单片机怎样把一个数字发送出去? 通信协议入门单片机怎样把一个数字发送出去我们每天都在说“发送一个字节”但导线上并没有一个叫“字节”的东西在奔跑。导线上真正存在的只是随时间变化的电压。UART、I²C、SPI、CAN 看起来各不相同但它们都在解决同一件事发送端怎样把信息变成物理信号接收端又怎样从物理信号中还原信息。这一篇不要求你有任何电路基础。我们只从一个数字开始完整走完它从程序到导线、再从导线回到程序的过程。读完以后你应该能够回答三个问题数字、二进制、数据帧和电平是什么关系发送端和接收端必须提前约定哪些规则拿到一张时序图应该从哪里开始看一、我们要发送的到底是什么假设程序要发送字符A。计算机不会直接保存“A 的形状”而是按照字符编码表把它保存成一个数字。在 ASCII 编码中表达方式值用途字符A人容易理解十进制65普通数字写法十六进制0x41程序和调试工具常用二进制0100 00018 个数据位这四种写法描述的是同一个数。需要注意的是0x41只有在程序按照 ASCII 解释时才代表字符A。它也可以代表温度 65 ℃、设备状态 65或者某条命令的参数。导线不知道 0x41 是什么。数据的含义来自通信双方共同遵守的约定。二、二进制的书写顺序不等于线上的发送顺序我们通常把0x41写成0100 0001默认是最高位b7写在左边最低位b0写在右边。但是协议真正发送时不一定从左边开始UART 通常从最低位b0开始发送也就是 LSB First。I²C 通常从最高位开始发送也就是 MSB First。SPI 可以由设备和控制器配置决定。CAN 的字段和字节都有自己的发送规则。所以看到一个二进制数时不能直接认为“最左边那一位一定最先发送”。第一条重要结论纸面书写顺序和时间上的发送顺序是两件事。三、为什么不能把 8 个数据位直接扔到线上如果发送端直接输出 8 个电平接收端会遇到很多问题它不知道传输什么时候开始。它不知道现在看到的是第几个比特。它不知道这一组数据什么时候结束。它不知道数据是否被干扰。它可能不知道这组数据属于哪个设备或哪类消息。因此通信协议通常会在有效数据前后增加控制信息组成一个有边界的整体这就是数据帧。不同协议采用了不同方法协议怎样标记开始怎样组织数据怎样结束或确认UART起始位数据位、可选校验位停止位I²CSTART地址、R/W、数据ACK/NACK、STOPSPI通常由 CS 选中设备按时钟连续移位通常由 CS 释放结束CANSOFID、控制、数据、CRCACK、EOF数据帧通常在解决四类问题边界从哪里开始到哪里结束。身份或含义数据属于哪个设备或哪类消息。长度后面应该继续接收多少数据。可靠性是否需要应答、校验、CRC 或重发。四、比特怎样变成真实导线上的电压数字电路会把逻辑 0 和逻辑 1 转换成不同的电压范围。以常见的 3.3 V CMOS 信号为例高电平通常接近 3.3 V。低电平通常接近 0 V。但接收器并不是要求电压“必须恰好等于 3.3 V 或 0 V”而是根据芯片数据手册规定的输入阈值把实际电压判断为高或低。同一个逻辑帧还可以经过不同收发器变成不同的物理信号MCU 的 UART 可以直接使用 3.3 V CMOS 电平。UART 经过 RS-232 收发器后可以变成正负电压。UART 经过 RS-485 收发器后可以变成差分电压。CAN 控制器的数据经过 CAN 收发器后变成 CAN_H 与 CAN_L 上的差分信号。这也是为什么UART 不等于 RS-232也不等于 RS-485。五、理解通信时最好把它分成三层层次它关心的问题常见例子应用含义这个数代表字符、温度还是命令ASCII、寄存器表、DBC 信号协议与帧先发什么、怎样采样、怎样确认UART、I²C、SPI、CAN物理信号用什么电压、驱动方式和线缆CMOS、RS-232、RS-485、CAN PHY很多初学者觉得通信协议混乱是因为把这三层混在了一起。例如“UART 发送字符 A”实际上包含了三个步骤应用层决定数字0x41代表字符A。UART 把0x41放进起始位、数据位和停止位构成的帧。输出电路把每一位转换成随时间变化的电压。接收端则按相反方向还原。六、接收端怎样知道现在是第几个比特接收器不会一次性看到一个完整字节。它只能在某些时刻读取线路电压这个动作叫采样。同步协议和异步协议的做法不同I²C、SPI 等同步协议提供时钟线接收端在约定的时钟边沿或电平窗口采样。UART 没有独立时钟线通信双方必须提前约定波特率接收端发现起始位后按位时间定期采样。CAN 没有单独的时钟线但各节点通过边沿同步和位时序规则保持一致。数据在采样点到来前必须已经稳定并在采样点之后继续保持一小段时间这就是建立时间Setup Time保持时间Hold Time如果数据正好在采样时刻变化接收端就可能得到错误结果。七、拿到一张时序图应该怎么读不要一开始就盯着所有缩写。可以固定按照下面的顺序先从左向右确认时间方向。一次只看一根信号线。找到通信前的空闲状态。找到第一次关键变化也就是起始条件。找出接收端真正采样的时刻。在采样点读取 0 或 1。最后再把连续比特组合成字段、字节和数据帧。八、用一分钟检查自己是否理解尝试不看上文回答下面的问题导线上直接传输的是字符A吗把二进制写成0100 0001是否说明一定先发送最左边的 0为什么通信双方必须使用相同的协议规则UART 和 RS-232 为什么不能画等号参考答案不是。导线上传输的是随时间变化的物理信号接收端先还原数字再按照编码解释为字符。不是。那只是常见书写顺序真正的发送顺序由协议和配置决定。因为电平自身没有边界和含义双方必须对速率、位序、帧格式和电气条件达成一致。UART 主要描述异步数据帧RS-232 主要描述电气接口。UART 帧可以经过 RS-232 收发器传输但两者不是同一个概念。写在最后学习通信协议不应该从背缩写开始。先问清楚信息原本是什么它被编码成了哪些比特协议在比特外增加了什么规则比特怎样变成线上的物理信号接收端在什么时刻采样只要这条链路能够在脑中连起来后面学习 UART、I²C、SPI 和 CAN就不会再像面对几组毫无联系的术语。
返回列表