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:写入一个字节并从串口读取十进制数据 的相关文章

随机推荐