为什么我无法通过 RS232 成功发送消息?

电器工程 stm32 UART rs232
2022-01-07 17:58:11

因此,过去一周我一直致力于从 STM32F407 发送 UART 消息,并使用白蚁通过 ugreen RS232 到 USB 电缆在我的笔记本电脑上读取它。

我已经使用 STMCube 生成代码并通过阅读“stm32f4xx_hal_uart.c”文件顶部的相关说明(并观看大量视频并在线阅读)来添加代码。

我在示波器上检查了传输的消息,它与它的 ASCII 表示相匹配。

例如,我发送“Q”即 0101 0001,我收到“W”即 0101 0111。示波器上的读数显示:

在此处输入图像描述

与示波器上显示的信号相同的白蚁输出。 在此处输入图像描述

我已经确认波特率/奇偶校验/硬件控制在白蚁和我的代码中匹配。

为了接收正确的字符,我尝试降低和提高波特率。
我尝试了不同的字符集来尝试找到导致显示错误字符的模式。
此外,我尝试过不同的终端,例如 Putty 或 Teraterm。

2个回答

您错过了 RS232 的一个主要细节。逻辑电平如下:

在此处输入图像描述

图 1. RS232 信号电平。资料来源:维基共享资源

  • 逻辑 1 = -3 至 -12 V。
  • 逻辑 0 = +3 至 +12 V。
  • 在 -3 和 +3 之间,逻辑电平未定义。
  • RS232 起始位为逻辑 0。

要将 TTL (5 V) 逻辑转换为 RS232,需要一个驱动器。MAX232 等芯片为您进行逻辑电平反转和升压。

如果逻辑电平反转,有时可能会“作弊”并将 TTL 信号输入 RS232 输入。这种方法的可靠性取决于RS232输入上使用的芯片。

在此处输入图像描述

图 2. 发射波形。最上面是您传输的“Q”的位模式。底部是 RS232 输入如何读取它。

请注意,RS232 输入正在寻找一个上升沿来指示起始位。直到数据的第二位才会发生这种情况,因此此后的所有内容都向右一位并在接收器看到时反转。幸运的是,您的 MSB 是停止位的正确逻辑电平,因此接收器将其解释为有效帧,对其进行解码并显示“W”。

出于测试目的,您可以反转 TTL 输出。这可能会起作用,因为它目前正在“工作”。

在此处输入图像描述

图 3. MAX232芯片在电荷泵电路中使用电容器来提升 RS232 电平的 5 V 电源。

为了可靠性,添加一个 MAX232 芯片来发送和接收适当的 RS232 电平信号。

考虑到 9600 的短距离和低比特率,TTL 和 CMOS 电平可以正常工作。@Transistor 雄辩地详述的问题是 UART 数据是负逻辑 0~5V 而 RS-232 是正逻辑 +/-V f 在 +/-3 和 +/-15V 之间(?)

因此,正如*他还建议的那样,逆变器将起作用。

问题不是误码率 (BER) 问题或信号完整性,而是反转逻辑。

此外,“灰色地带”是针对长距离噪声容限的,因为您的电缆很短,所以对您来说它不是 <+/-3V。RS-232 Rx 的实际逻辑阈值与旧 TTL(两个 Vbe 下降)或 1.4V +/-20%(?) 容差完全相同。

他们称其为灰色区域,以便满足由于噪声毛刺和边缘振铃导致的所有距离和波特率规范。

对于更长的电缆,请使用任何 MAX232。变化可能取决于电压速度和特性。