问题描述:我正在尝试使用 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