如何解决Python:使用 CP2102 模块通过 UART 与设备通信
总结问题:
通过串行方式向连接的设备(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 在建立连接时也没有显示任何内容。
解决方法
你的代码很乱。但是我们先开始调试串口连接本身。
甚至在此之前:免责声明。你的调谐器手册质量很差,所以我的回答是基于我阅读时的最佳猜测。如果您决定遵循任何建议,请记住这一点,并记住,如果没有任何效果或您破坏了您的产品,我不会受到责备。
现在,让我们继续吧。您没有解释如何将调谐器连接到串行端口或如何为电源供电。假设您使用板上的 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)。正确完成这三个连接后,仔细检查是否接触良好,它们不会轻易松脱(如果您有万用表,最好检查每根电线的导通性),您就可以使用软件了。>
此时,我的建议是首先尝试使用 tio
、minicom
、puTTY
或您喜欢的任何其他终端软件建立并运行连接。这样就可以将代码搁置一旁,避免许多问题。
如果您使用 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。
祝你好运,用你的收音机玩得开心。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。