Python: 使用 CP2102 模块通过 UART 与设备通信

Python: Communicating with device over UART using CP2102 module

问题总结:

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

描述您尝试过的内容:

我使用下面的代码向打开的端口写入命令,希望它能 return 预期的信息:

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。

描述预期和实际结果:

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

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 也没有显示任何内容。

你的代码很乱。但是让我们先开始调试串口连接本身。

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

现在,让我们继续吧。您没有解释如何将调谐器连接到串行端口或如何为电源供电。假设您使用电路板上的 USB 连接器供电,我 猜测 手册中提到的 TTL 电压电平将是 5 伏(如果您想完全确定您会 --have用万用表测量 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

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

最后,让我们转到您的 pyserial 代码。在这方面,你犯了几个错误。首先,您不应该两次实例化端口,先用 ser=... 定义端口,然后再用 with... as 定义端口。接下来,您需要编写完整的命令:AT+RET 而不仅仅是 RET(我不知道为什么他们再次在您问题中包含的 table 上写了 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秒)结束,然后return 它读取的所有内容,希望是调谐器的详细信息)。

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

祝你好运,玩得开心。