gpt4 book ai didi

python - pySerial inWaiting 返回不正确的字节数

转载 作者:行者123 更新时间:2023-11-28 21:58:03 24 4
gpt4 key购买 nike

我有一个简单的程序来测试串行功能。我的串行设备对两个输入作出 react 。如果用户输入“a”,它会以“fg”响应。如果用户输入任何其他字符/字节,它会以“z”响应。如果我将“b”发送到串行设备,它会返回“z”就好了。当我发送“a”时,它应该同时返回“f”和“g”,所以是两个字节而不是一个。

请参阅下面的代码。

#!/usr/bin/env python

import serial

ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS
)

ser.write('a')
byteData = ser.read(1) # read one, blocking
moreBytes = ser.inWaiting()

if moreBytes:
byteData = byteData + ser.read(moreBytes)
print byteData

print byteData


ser.close()

输出是:

user@ubuntu:~/code/native$ ./serialTesting.py 
f

inWaiting() 给出的值为 0,因此它永远不会读取第二个字节。如果我对代码做一个小改动,并手动读取两个预期的字节,它就可以正常工作。

#!/usr/bin/env python

import serial

ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS
)

ser.write('a')
byteData = ser.read(2) # read two expected bytes for the result 'fg'

print byteData

ser.close()

输出符合预期:

user@ubuntu:~/code/native$ ./serialTesting.py 
fg

最佳答案

对此有两个不错的解决方案。对于任何一种,您都需要像 jramirez 已经建议的那样设置超时:

ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
timeout=0.5, # IMPORTANT, can be lower or higher
inter_byte_timeout=0.1 # Alternative
)

解决方案一:简单有效

byteData = ser.read(size=800) #Set size to something high

这将读取最多 800 个字节,并且不会超过您设置的 timeout 时间。如果您改为设置 inter_byte_timeoutread() 将为每个 单个 字节等待最多该时间。

这是一个快速的解决方案,适用于您只收到已知最大大小的数据 block 的情况。

解决方案2:正确的方法

def read_all(port, chunk_size=200):
"""Read all characters on the serial port and return them."""
if not port.timeout:
raise TypeError('Port needs to have a timeout set!')

read_buffer = b''

while True:
# Read in chunks. Each chunk will wait as long as specified by
# timeout. Increase chunk_size to fail quicker
byte_chunk = port.read(size=chunk_size)
read_buffer += byte_chunk
if not len(byte_chunk) == chunk_size:
break

return read_buffer

上面的代码片段已根据 CC0 1.0 获得许可.

然后,阅读:

byteData = read_all(ser)

基本上,这将以 block 的形式读取您的数据,并每次都等待查看是否出现新字符。如果在 timeout 设置的时间内读取的字符较少,则认为传输完成。

即使您收到大量数据或接收速度非常慢,此解决方案也始终有效。

关于python - pySerial inWaiting 返回不正确的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19161768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com