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

Python 3.x Python:使用CP2102模块通过UART与设备通信,python-3.x,serial-port,putty,pyserial,uart,Python 3.x,Serial Port,Putty,Pyserial,Uart,总结问题: 通过串行向连接的设备(FM调谐器)发送命令不会产生响应。连接已打开,我已验证比特率是否正确,设备 描述您的尝试: 我使用下面的代码向开放端口写入命令,希望它返回预期的信息: import serial ser = serial.Serial('/dev/ttyUSB0') # open serial port print(ser.is_open) # make sure port is open with serial.Serial('/de

总结问题:

通过串行向连接的设备(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
下图列出了命令和预期输出

我还尝试在树莓皮4上使用tio,在Windows10机器上使用PuTTY

描述预期和实际结果:

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

True
b''
[tio 15:57:03] tio v1.32
[tio 15:57:03] Press ctrl-t q to quit
[tio 15:57:03] Connected
这是通知我串行端口已打开,但没有从“ser.read”接收数据。未收到任何错误消息

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

True
b''
[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引脚上测量接地-接地-或详细研究电路,则手册上的图片分辨率不足以给出正确答案)

假设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
您现在可以键入(直到最后才在屏幕上说任何话):

然后按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
(我不知道他们为什么在你的问题中包含的表格上写+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
命令\u to\u send=“AT+RET\r”
,或者您需要CR和NL


祝你好运,让你的收音机玩得开心。

你好,你有几个问题。你能发布一个指向调谐器完整手册的链接吗?我可以用一些想法写一个答案,但我更愿意先看一下细节,使它尽可能有用。@MarcosG。这是手册的链接:太好了,谢谢。我会看一看,然后再试一次。@MarcosG这是一个尽快的答案。应该很简单。考虑到最少的文档,这是一个非常好的回答。我只需要最少地修改你的脚本,我是abl