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

如何解决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 在建立连接时也没有显示任何内容。

Chart of commands and expected outputs

解决方法

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

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

现在,让我们继续吧。您没有解释如何将调谐器连接到串行端口或如何为电源供电。假设您使用板上的 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。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-