避免二进制中无输入和零之间的混淆?

电器工程 数字逻辑 数据 二进制
2022-01-16 17:36:30

假设我通过 FM 传输数据,其中 0 是 2Hz,1 是 4Hz。无输入时,发射器以 2Hz 的频率发射。如果我将收到的二进制文件输入到微控制器的 UART 端口,微控制器将如何区分无数据和 0?

例如,这在传输 ASCII 字符时变得相关。假设以下字符串:

01000110 01101111 01101111 01100010 01100001 01110010

因为我添加了空格,我们可以将其翻译为:

富吧

但是对于机器来说,字符串看起来像这样:

010001100110111101101111011000100110000101110010

您将如何创建这些“空格”,以便在接收二进制文件时不会弄乱 ASCII 字符?

4个回答

如果您向微处理器的 UART 端口馈送某些东西,如果您希望微处理器了解您向其馈送的内容,则必须遵循 UART 通信协议。您需要将每个 ASCI 字符嵌入到包含起始位、停止位和可能的奇偶校验位的 UART 包中, UART Wikipedia page上提供了更多信息

当您不发送时,总线处于空闲状态并保持在逻辑高状态。当你开始传输一个包时,第一位总是逻辑低。这是开始位。然后是八个数据位,然后是一个逻辑高的停止位。微处理器知道下一位何时到达,因为它知道您配置的总线速度。因此,可以发送例如两个相邻的零。微处理器和向微处理器传输的单元都需要配置相同的传输速度、奇偶校验和停止位数。

很多技术可以做到这一点。您可能想查看曼彻斯特编码或 NRZ 代码。8b/10b 编码,它将每 8 个数据位映射到一个 10 位序列,允许时钟恢复、纠错和可用于检测传输开始和结束的特殊“逗号”符号。

所有 ASCII 字符都是 8 位宽,您可以在 ASCII 表中看到。ASCII 字符的 HEX 值不超过 FF (1111 1111)

UART 一次不能接收超过一个数据字节(8bits),除了 8bit 数据之外,还有 STOP 和 START 位,PARITY 等等,如下图所示,它们共同构成了 UART 通信包。

在此处输入图像描述

因此,当您将 ASCII 字符发送到 UART 时,您将它们一一发送,这就是字符串的制作方式。您已经知道字符串只是一个字符数组。

正如 Mattias 所解释的,UART 协议是一种基于时间的异步协议。定义位之间边界的是从起始位开始所花费的时间。(N+half)/baudrate因此,微控制器将在起始位开始后的几秒钟内“采样”该位。半位只是在位的中间进行采样,因此接收器和发送器之间的时序可能有半位差异(请记住,差异是累积的,最坏的情况发生在每帧的最后一位,通常是,但并非总是 8 位宽,具体取决于配置)。使其工作的关键是使接收器和收发器的波特率尽可能接近。

因此,微控制器计算每个位之间的时间,以了解每个位在帧内的位置。下一个字符将进入下一帧。当每一帧结束时,微控制器开始自动监听下一帧,因此当下一个起始位到来时,它已经知道它应该开始一个新帧。这就是字符被分开的方式。

此外,我还要补充一点,您实际上不需要两个频率来传输到 UART 接收微控制器。您可以将单个频率用作OOK而不是将两个频率用作FSK它具有更高的频谱效率并且电路更简单,因为您只需要一个载波切换器作为发射器和一个单一的频率检测器作为接收器,就像莫尔斯电码一样。请记住,通常使用频率远高于波特率的载波,否则较简单的电路将无法正常工作。