为什么我不能通过RS232成功发送消息?


9

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

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

我已经在示波器上检查了传输的消息,它匹配了它的ASCII表示形式。

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

在此处输入图片说明

白蚁输出的信号与示波器上显示的相同。 在此处输入图片说明

我已经确认白蚁和代码中的波特率/奇偶校验/ HWcontrol匹配。

为了获得正确的字符,我尝试降低和提高波特率。
我尝试使用不同的字符集来尝试查找导致显示错误字符的模式。
另外,我尝试了其他终端,例如在Putty或Teraterm上。


8
您的“ RS232到USB电缆”是否可以使用RS232电压电平或“ TTL”电压电平,并且STM32F407板是否使用了适合这些电平的驱动器/接收器?我几乎可以肯定,问题2的答案是“否”,因为如果我通过“错误的电平和极性”过滤器来解释您的示波器轨迹,我也会看到“ W”。您的主板极有可能没有驱动程序/接收器硬件(因此使用TTL电平),而您的“ RS232转USB电缆”具有RS232驱动器/接收器硬件(因此使用RS232电平)。
brhans

3
尝试一些不同的字符将立即确认@brhans假设。一遍又一遍地发送相同的字符而期望得到不同的结果是精神错乱的定义之一……
Dave Tweed

3
FeraTaTa-到目前为止,我还没有提到一个点:乍一看,您的示波器轨迹显示了一个信号,该信号似乎在0V时处于空闲状态(请看1该轨迹左侧带有黄色背景的符号-这就是(0V电平),然后在0V以下发出脉冲。对于直接来自STM32的逻辑信号来说,这不是正确的,实际上,这不是正确的。在左下角,您已将通道1设置为AC耦合(这是在~那里看到的符号)。信号实际上是高空转并且脉冲到0V左右。使用DC耦合可以清晰地查看该信号。
SamGibson

Answers:


22

您错过了RS232的主要细节。逻辑级别如下:

在此处输入图片说明

图1. RS232信号电平。资料来源:Wikimedia Commons

  • 逻辑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电平信号。


3
作为更好的替代方法,可以使用USB至TTL UART电缆。如果OP仍在使用USB适配器,那么添加额外的芯片来进行电平转换就没有多大意义了。
格雷厄姆

1
RS-232是逻辑0 =双极性V +,大于2V且TTL等效阈值为1.5V(典型值)。像74HCTxx这样的CMOS具有小的滞后(50mV ??)
Tony Stewart Sunnyskyguy EE75

6
请用英语,托尼?
晶体管

3
那是EE的英语,您不理解哪一部分?RS232在空闲时为-V,在启动时为> + 2V,但对于数据电压为负逻辑(0 = V +,1 = V-),在V-时停止。我敢打赌,您不知道RS-232阈值为
1.4〜1.5V

8
谢谢,托尼。这更具可读性和明智性。您在太多快速回复中遗漏了标点符号,关键词和用法。我是一个像您一样的老男孩,拥有近四十年的EE。我的图1显示了RX的阈值电压。另请参见OmegaAnalogWikipediaMaxim。TX的所有状态均为±5 V,RX的所有状态均为±3V。
晶体管

7

考虑到短距离传输和9600的低比特率,TTL和CMOS电平可以正常工作。@Transistor雄辩地详细说明了这个问题,即UART数据是负逻辑0〜5V,RS-232是正逻辑+/- V f,介于+/- 3和+/- 15V(?)之间。

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

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

另外,“灰色区域”用于长途噪声容限,因为电缆短,所以对于您而言,它不是<+/- 3V 。RS-232 Rx的实际逻辑阈值与旧的TTL(两个Vbe压降)或1.4V +/- 20%(?)容差完全相同。

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

如需更长的电缆,请获取任何MAX232。变化可能取决于电压速度和功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.