Python Shell:写入一个字节并从串口读取十进制数据

2024-03-28

问题描述:我正在尝试使用 rs232 检索存储在设备上的所有数据。

How?:对于这个特定设备,我需要:

  • Step 1:发送一个字节(0x80)-uInt8(8 位无符号整数)通过串行端口 (COM5) 并期望收到 0x81 作为响应。
  • Step 2:发送第二个字节(0x81)并期望逐行接收所有存储的数据。

Note:设备正在自动传输其拥有的数据。它一次只接受一个字节(在我的例子中,一次发送两个字节足以检索数据---Step 1 and Step 2).

设备测试:在进行实验之前,我首先测试了我的串行连接是否正常工作。首先,我使用名为的终端仿真程序测试了串行连接RealTerm:串行/TCP 终端 https://sourceforge.net/projects/realterm/。其次,我使用以下命令运行 Matlab 测试外壳命令 https://www.mathworks.com/help/instrument/serialport.read.html。我可以检索设备上存储的所有数据以进行这两个测试。


我尝试了什么?: 我尝试写一个Python脚本 https://stackoverflow.com/q/73054548/10543310 and a Node.js 脚本 https://stackoverflow.com/q/73087378/10543310。不幸的是,这两个脚本都不起作用,每当我发送 0x80 时,这两个脚本都会给出 0x00(我未能通过Step 1)。我不确定问题出在哪里! (我已经尝试了7天了)

今天,我考虑使用 Python Shell 而不是脚本来运行一个实验。

>>> import serial
>>> rs232 = serial.Serial(
...     port = 'COM5',
...     baudrate = 115200,
...     bytesize = serial.EIGHTBITS,
...     parity = serial.PARITY_NONE,
...     stopbits = serial.STOPBITS_ONE,
...     timeout=1
...     )
>>> rs232.write(0x80)
128
>>> rs232.read(size=1)
b'\x87'
>>> rs232.read(size=2) 
b'\x87\x87'
>>> rs232.read(size=5) 
b'\x87\x87\x87\x87\x87'

这给了我一些希望,因为我可以在Step 1实验。不过,我不确定为什么我会收到b'\x87' (ord(rs232.read(size=1)) -> 135) 代替0x80. Also, rs232.read(size=5)给出相同的值!嗯,我是嵌入式编程的新手。对于这里的任何混乱,我深表歉意。

我还读过一些关于使用buffer但不知道如何将它用于我的实验(Step 1 and Step 2).


我在期待什么?我希望能够编写一个 Python 脚本而不是使用 Python Shell 来检索设备中存储的所有数据并将其逐行保存到 CSV 文件中。

基于所有反馈的可行解决方案: 在采纳了这个问题的答案中的所有建议之后,我最终解决了一些问题,我希望有人帮助我解决它。

import serial, time

rs232 = serial.Serial(
    port = 'COM6', 
    baudrate = 115200, 
    bytesize = serial.EIGHTBITS,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    timeout=5,
    write_timeout=5
    )

rs232.is_open
rs232.set_buffer_size(rx_size = 2000000, tx_size = 2000000)

# cleanup RX/TX buffer
rs232.rts=True
rs232.reset_input_buffer()
rs232.reset_output_buffer()

time.sleep(2)
rs232.write(bytes([0x80, 0x82, 0x83]))

time.sleep(5)
while True:
    myBytes = rs232.readline()

    data.append(myBytes)
    print(myBytes)
    if myBytes == b'\r\x83\x87':
        break

我的建议:

  1. 确保连接设置确实相同(我会将它们与 Matlab 进行比较)
  2. 发送正确的命令:屏幕截图中的第一个是 b'\x80',第二个是 b'\x82',尽管这里你写的是 b'\x81'
  3. 在写入和读取上添加 5 秒超时,这样你就一定知道是否有东西在等待
  4. 按照评论中的建议重置输入和输出缓冲区
  5. 使用日志记录来查看每个命令的时间
  6. 添加额外的睡眠,看看是否有任何变化
  7. 作为最后的手段,你可以尝试使用不同的库https://pyvisa.readthedocs.io/en/latest/index.html https://pyvisa.readthedocs.io/en/latest/index.html

我的测试脚本会是这样的(运行python -u 以避免缓冲日志输出):

import logging
import serial
import time
from pathlib import Path

logging.basicConfig(level='INFO', format='%(asctime)s - %(message)s')

logging.info('open')
rs232 = serial.Serial(
    port='COM5',
    baudrate=115200,
    bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    timeout=5,
    write_timeout=5,
)

logging.info('reset buffers')
rs232.reset_input_buffer()
rs232.reset_output_buffer()

logging.info('write first')
rs232.write(b'\x80')

# time.sleep(1)  # see if uncommenting changes anything

logging.info('read first')
reply = rs232.read(size=1)
logging.info(reply)

logging.info('write second')
rs232.write(b'\x82')

# time.sleep(1)  # see if uncommenting changes anything

logging.info('read second')
# reply = rs232.read_until(expected=b'\x0a\x0d')  # read single line
reply = rs232.read_until(expected=b'\x80')
Path('result.csv').write_text(reply.decode().replace('\n\r', '\r\n'))
logging.info(reply)

logging.info('close')
rs232.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Shell:写入一个字节并从串口读取十进制数据 的相关文章

  • 如何使用AWK从文件中连续输出行

    我有一个多行文件 我想连续输出文件的某些行 比如第一次 从第1行打印到第5行 下次 打印第2行到第6行 依此类推 我发现 AWK 是一个非常有用的函数 我尝试自己编写代码 但它什么也没输出 以下是我的代码 bin bash for n in
  • 以编程方式设置 mosquitto 中的访问控制限制

    我正在开发一个将使用 mqtt 的应用程序 我将使用 python 库 我一直倾向于使用 mosquitto 但找不到以编程方式为其设置访问控制限制的方法 我正在编写的应用程序需要能够区分用户 并且只允许他们订阅某些主题 当前的解决方案看起
  • 自定义 pytest junitxml 失败报告

    我正在尝试内省测试失败并将附加数据包含到 junit xml 测试报告中 具体来说 这是对外部产品的一套功能测试 我想将产品的日志包含到故障报告中 使用找到的方法here https stackoverflow com questions
  • 具有透明框架和不透明边缘的图例

    设置图例透明度时 plt legend framealpha 0 5 它会影响背景和边缘 如何仅将透明度应用于背景而不应用于边缘 我努力了 plt legend edgecolor 0 0 0 1 facecolor 1 1 1 0 1 我
  • 使用 python 从 XSD 文件创建特定的 XML 文件

    我有一个现有的 xsd 架构 并且需要创建 希望使用 Python 带有一些特定输入的 XML 文件 最好的方法是什么 我尝试了 Element Tree 和 xmlschema 但我无法判断它们是否允许从已知的 XSD 架构开始生成 XM
  • PyCharm 虚拟环境和 Anaconda 环境有什么区别?

    当我在 PyCharm 中创建新项目时 它会创建一个新的虚拟环境 我读到 当我执行Python脚本时 它们是使用此环境中的解释器而不是系统环境来执行的 因此 如果我需要安装一些软件包 我只能将它们安装在这个环境中 而不是在系统环境中 这很酷
  • pandas dataframe 视图与复制,我如何区分?

    有什么区别 pandas df loc col a col b and df loc col a col b 下面的链接没有提到后者 尽管它有效 两者都拉视图吗 第一个拉取视图 第二个拉取副本吗 http pandas pydata org
  • buildozer android NDK 未下载 Ubuntu

    我使用的是 Ubuntu 16 04 LTS 操作系统 我已经在 python2 和 python3 中安装了 buildozer android sdk 已安装 但 buildozer 在下载 android NDK 时显示错误 请帮我解
  • 如何设置 QTableView 中特定单元格的线条样式?

    我正在使用 QT GUI 我正在使用 QTableView 实现一个简单的十六进制编辑控件 我最初的想法是使用一个有十七列的表格 表的每一行都有 16 个十六进制字节 然后在第十七列中显示该数据的 ASCII 表示形式 理想情况下 我想编辑
  • 打开文件对象的大小

    有没有办法找到当前打开的文件对象的大小 具体来说 我正在使用 tarfile 模块来创建 tarfile 但我不希望 tarfile 超过特定大小 据我所知 tarfile 对象是类似文件的对象 所以我想通用的解决方案会起作用 ls la
  • C#等待串口数据

    我试图通过 C 应用程序从指纹扫描仪获取数据 但在指纹发送之前 我的整个代码都会执行 我尝试使用延迟功能System Threading Thread Sleep 1000 因此它可以在下一步执行之前获取数据 但这一切似乎都是徒劳的 任何人
  • 我无法在 docker 中安装 opencv-contrib-python

    我尝试安装opencv contrib python但我无法让它在 docker 上工作 它说找不到满足 opencv contrib python 要求的版本 I tried pip install opencv contrib pyth
  • 后视模式无效

    为什么这个正则表达式在 Python 中有效 但在 Ruby 中无效
  • 使用变量访问 Django 模板中的字典元素

    情况如下 我们渲染一个视图 return render request test html db object db object dict dict 在模板中 我们现在想要访问字典db object key 在Python中你通常会这样做
  • 将收藏计数器变成字典

    我有一个由该函数产生的集合结果 Counter df email address 它返回每个单独的电子邮件地址及其重复次数 Counter nan 1618 email protected cdn cgi l email protectio
  • 运行 php 脚本的 Bash 脚本

    我有一个 php 脚本 我想使用 bash 脚本运行它 所以我可以使用 Cron 每分钟左右运行 php 脚本 据我所知 我需要创建 bash 脚本来处理 php 脚本 然后我才能使用 Cron 工具 计时器 到目前为止 我被告知我需要输入
  • 将多列传递给 groupby.transform

    据我所知 当您使用 DataFrame 列调用 groupby transform 时 该列将传递给转换数据的函数 但我无法理解的是如何将多个列传递给函数 people DataFrame np random randn 5 5 colum
  • 如何使用 RGB 元组列表在 PIL 中创建图像?

    假设我有一个像素列表 表示为具有 3 个 RGB 值的元组 列表如下list im getdata 像这样 0 0 0 255 255 255 38 29 58 如何使用这种格式的 RGB 值 每个元组对应一个像素 创建新图像 感谢您的帮助
  • 在 Python 中规范化数字列表

    我需要对值列表进行标准化以适应概率分布 即在 0 0 和 1 0 之间 我明白how标准化 但很好奇 Python 是否有一个函数可以自动执行此操作 我想从 raw 0 07 0 14 0 07 to normed 0 25 0 50 0
  • 减小散点图的文件大小

    我目前正在尝试减小散点图的文件大小 我的代码如下所示 plt scatter a1 b1 plt savefig test ps 其中 a1 b1 是大小为 400 000 左右的数组 它给出的文件大小为 7 8MB 我尝试过添加 plt

随机推荐