【问题标题】:Python Shell: writing one byte and reading decimal data from a serial portPython Shell:写入一个字节并从串口读取十进制数据
【发布时间】:2022-07-31 18:05:08
【问题描述】:

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

如何?:对于这个特定的设备,我需要:

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

注意:设备会自动传输其拥有的数据。它一次只接受一个字节(在我的情况下,一次发送两个字节就足以检索数据 --- Step 1Step 2)。

设备测试:在运行我的实验之前,我首先测试了我的串行连接是否正常工作。首先,我使用名为RealTerm: Serial/TCP Terminal 的终端仿真程序测试了串行连接。其次,我使用shell commands 运行 Matlab 测试。我可以为这两个测试检索存储在设备上的所有数据。


我尝试过什么?:我尝试过写Python ScriptNode.js Script。不幸的是,这两个脚本都不起作用,每当我发送 0x80 时,两个脚本都会给出 0x00(我未能通过 步骤 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'

这给了我一些希望,因为我可以在第 1 步实验中从设备收到一些反馈。不过,我不确定为什么我收到的是b'\x87' (ord(rs232.read(size=1)) -> 135) 而不是0x80。此外,rs232.read(size=5) 给出相同的值!!好吧,我是嵌入式编程的新手。对于此处的任何混淆,我深表歉意。

我还阅读了有关使用 缓冲区 的内容,但不知道如何将其用于我的实验(步骤 1步骤 2 )。


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

【问题讨论】:

  • 你试过在终端运行python -m serial.tools.list_ports吗?
  • 为什么不参考搜索找到的这篇文章的程序呢? serial-terminal · GitHub Topics, pyserial/miniterm.py at master - serial - GitHub
  • @0x263A,我试过了,我可以看到COM5
  • 就像我之前使用终端仿真程序的建议一样,这个问题可以再次使用终端仿真程序进行调试。使用两个相互连接的 USB 转串行适配器创建串行链路。链接的一端由您的被测程序提供服务。另一端由终端仿真程序提供服务(代替您的神秘“设备”)。使用终端模拟程序手动模拟您的神秘“设备”。可能先在两端使用终端仿真程序进行验证。
  • 您应该在发送和接收之前重置输出和输入缓冲区。您还需要明确您的连接是哪种双工。

标签: python python-3.x shell serial-port embedded


【解决方案1】:

我的建议:

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

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

import logging
import serial
import time

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')
logging.info(reply)

logging.info('close')
rs232.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 2015-05-15
    • 2015-12-25
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多