【问题标题】:Python: Communicating with device over UART using CP2102 modulePython:使用 CP2102 模块通过 UART 与设备通信
【发布时间】:2021-03-30 20:00:58
【问题描述】:

总结问题:

通过串口向连接的设备(FM 调谐器)发送命令不会产生响应。连接已打开,我已验证比特率正确,并且设备

描述您的尝试:

我使用下面的代码向打开的端口写了一个命令,希望它会返回预期的信息:

import serial

ser = serial.Serial('/dev/ttyUSB0')  # open serial port
print(ser.is_open)                   # make sure port is open

with serial.Serial('/dev/ttyUSB0', 38400, timeout=5) as ser:    #baud rate is 38400, 5 sec timeout
    ser.write(b'RET')                                           #write "RET" to device
    reads = ser.read(5)                                         #read data from device
    print(reads)                                                #print data

下图列出了命令和预期输出。

我还尝试在 Raspberry Pi 4 上使用 tio,在 Windows 10 机器上使用 PuTTY。

描述预期和实际结果:

预期结果将返回具有表中提到的属性的字符串。但是,返回的结果如下:

True
b''

这通知我串行端口已打开,但没有从“ser.read”接收数据。未收到任何错误消息。

使用 tio,它打开了一个连接并显示以下内容:

[tio 15:57:03] tio v1.32
[tio 15:57:03] Press ctrl-t q to quit
[tio 15:57:03] Connected

但之后什么都没有。

PuTTY 在建立连接时也没有显示任何内容。

【问题讨论】:

  • 你好,你有几个问题。您可以发布调谐器完整手册的链接吗?我可以写一个带有一些想法的答案,但我更喜欢先看一下细节,以使其尽可能有用。
  • @MarcosG。这是手册的链接:m.media-amazon.com/images/I/718OBATJDzL.pdf
  • 太好了,谢谢。我会看看并尽快写一个答案。这应该很容易。

标签: python-3.x serial-port putty pyserial uart


【解决方案1】:

您的代码非常混乱。但是让我们首先开始调试串口连接本身。

甚至在此之前:免责声明。你的调谐器手册质量很差,所以我的回答是基于我阅读时的最佳猜测。如果您决定遵循任何建议,请记住这一点,并记住,如果没有任何效果或您破坏了您的产品,我不会受到责备。

现在,让我们继续吧。您没有解释如何将调谐器连接到串行端口或如何供电。假设您使用板上的 USB 连接器供电,我猜测手册中提到的 TTL 电压电平将为 5 伏(如果您想完全确定您将 - 必须测量RX或TX引脚上的万用表接地-GND-或详细研究电路,手册上的图片没有足够的分辨率给出一个好的答案。

假设 TTL 电平确实为 5 伏,您需要确保您的 USB CP2102 模块也在 5 伏下工作。这些模块中的大多数确实有一个跳线来选择 5 或 3.3 伏,因此请确保您的位置正确(请注意,某些用于 5 伏的设备将在 3.3 上工作,反之亦然,其他 - 根据我的经验,没有多少它们-将被销毁并且永远不会再工作)。

知道串行线路的电压后,您需要连接电线。这很简单:CP2102 上的 GND 到调谐器连接器上的 GND。 CP2102 上的 TX 到调谐器上的 RX,CP2102 上的 RX 到调谐器上的 TX(是的,你没看错:RX 到 TX 和 TX 到 RX)。在正确完成这三个连接后,仔细检查是否有良好的接触并且它们不会轻易松动(如果您有万用表,最好检查每根电线的连续性),您就可以开始软件方面了。

此时我的建议是首先尝试使用tiominicompuTTY 或您喜欢的任何其他终端软件建立连接并运行。这将把代码放在一边,避免许多问题。

如果您使用tio,您可以打开命令行并输入:

tio /dev/ttyUSB0 -b 38400 -e

请注意,-e 选项用于显示本地回显(您键入的内容)。现在你会得到你已经熟悉的提示:

[tio 09:13:09] tio v1.32
[tio 09:13:09] Press ctrl-t q to quit
[tio 09:13:09] Connected

您现在可以输入(直到最后您不会在屏幕上说任何内容):

AT+RET

然后点击 INTRO 然后点击 CTRL+j (这意味着你保持 CTRL 然后点击 j)。

您应该立即获得当前配置,例如:

VOL=10
FRE=87.5
PLAY
BANK_OFF

如果可行,您现在应该可以发送其他命令了。要将调谐频率更改为 90.0 Mhz,您可以键入:

AT+FRE=900

简介 CTRL+j

相反,如果调谐器没有发送您可能需要使用命令确认播放的任何内容。有时您只需要一个回车(如果是这种情况,您应该在点击 INTRO 后立即获得配置)或者您只需要一个换行符(尝试点击 CTRL +j 在命令之后,将介绍放在中间)。

最后,让我们看看你的 pyserial 代码。在这方面,你犯了几个错误。首先,您不应将端口实例化两次,首先用ser=... 定义端口,然后再用with... as 定义端口。接下来,您需要编写完整的命令:AT+RET 而不仅仅是 RET(我不知道他们为什么在您的问题中包含的表格上写 A+RET,再次:文档质量低于零)。

您可能还需要在编写命令之后和在端口上读取之前引入一个非常短的延迟。这可能是设备准备和发送答案所必需的。但这在很大程度上取决于您如何设置端口。如果你使用足够长的读取超时时间,你应该没问题。

像下面这样简单的东西应该可以工作:

import serial
ser = serial.Serial(port='/dev/ttyUSB0', baudrate=38400, bytesize=8, parity='N', 
stopbits=1, timeout=2, xonoff=False, rtscts=False, dsrdtr=False)
command_to_send = "AT+RET\r\n"
ser.write(command_to_send.encode())
received = ser.read(128)
print(received)

要读取的 128 个字节只是一个很大的数字,我们确信它会大于您将收到的实数,因此读取指令应该等到超时结束(2 秒)然后返回它读取的所有内容,希望是调谐器的详细信息)。

同样,在这里你可能需要使用命令,也许你只需要一个 CR command_to_send = "AT+RET\r" 或者你需要 CR 和 NL。

祝你好运,尽情享受你的收音机。

【讨论】:

  • 鉴于文档很少,这是一个很棒的回应。我只需对您的脚本进行最低限度的修改,就可以从设备获得响应。如果我之前将 3.3v 引线连接到 USB 串行的电源,它也会有所帮助!
  • 我很高兴我写的东西有用。我不确定我通过将 3.3V 引线连接到电源来理解您的意思。你是说 CP2102 上的 3.3V 引脚?你把它连接到3.3V电源?据我所知,您不需要在任何地方连接 CP2102 上的 3.3V。该引脚应该用于为另一个设备供电,如果您通过 USB 连接它,您的调谐器似乎不需要更多电源。当然,我不确定您的特定 CP2102 看起来如何......
  • 我撤回对电源要求的评论。我认为这可能是一个问题,因为制造商使用了 3.3v(这是 UART 使用的电压)或 5v,但我拔掉了它,通信没有问题。
  • 好的。这就说得通了。不管怎样,玩得开心
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多