Python 如何读取串行缓冲区中的一个字节,将其删除,然后转到下一个字节?
我正在用python编写一些代码来从串行端口读取字节,我需要从缓冲区中找到一个特定的字节。目前我的代码是:Python 如何读取串行缓冲区中的一个字节,将其删除,然后转到下一个字节?,python,Python,我正在用python编写一些代码来从串行端口读取字节,我需要从缓冲区中找到一个特定的字节。目前我的代码是: 导入序列号 i=0 ser=serial.serial('/dev/tty/AMA0',波特率=1000000) def findStart(): 印刷品(序列号(一)) 如果ser.read==0x5A: 打印('找到起始字节') i=0 其他: i=i+1 打印(“检查下一个字节”) findStart() findStart() 这不是我想要它做的,因为我希望它读取一个字节,然后转
导入序列号
i=0
ser=serial.serial('/dev/tty/AMA0',波特率=1000000)
def findStart():
印刷品(序列号(一))
如果ser.read==0x5A:
打印('找到起始字节')
i=0
其他:
i=i+1
打印(“检查下一个字节”)
findStart()
findStart()
这不是我想要它做的,因为我希望它读取一个字节,然后转到下一个,而不是像现在这样读取a,然后读取a和b,然后读取a和b,以及c。我还想在读取字节后删除它,以防止缓冲区被不必要的字节阻塞,有人能推荐如何执行这些操作吗?
提前感谢。使用i作为findStart的参数,
def findStart(i):
或者如果您确实想使用全局变量,您应该写:
import serial
i=0
ser = serial.Serial('/dev/tty/AMA0', baudrate=1000000)
def findStart():
global i
print(ser.read(i))
if ser.read == 0x5A:
print('Start byte found')
i=0
else:
i = i+1
print("Checking next byte")
findStart()
findStart()
首先,关于非标准波特率的注意事项:您确定要使用它吗?我觉得这不是个好主意 下一步:一旦读取字节,就会将其从缓冲区中删除,因此当您执行
serial.read()
1字节时,它将从RX缓冲区中取出,不再存在。结论:您的代码有缺陷
在我看来,更合理的做法是不要弄乱缓冲区,读取到达缓冲区的所有内容,并在代码中进行处理:
while True:
if serial.inWaiting() != 0:
data_read = serial.read(serial.inWaiting()) # read and empty buffer
index = data_read.find(b'\x05') # Was there a 0x05?
if index != -1: # 0x05 was read
if index == 0: # 0x05 was the first byte
if len(data_read) == bytes_you_need:
# You got your frame
else:
# Not quite: reorder based on index position
...
你的代码基本上是好的
ser.read(n)
返回字节对象中串行缓冲区的n个字节。字节在读取时被删除。所以不需要增加索引。您可以使用ser.read()
或ser.read(1)
一次读取1个字节。您还可以按照MarcosG的建议,使用ser.read(ser.Inwaiting())
读取串行缓冲区中的所有字节
因为您从读取中获得了bytes对象,所以与文本字节(b'\x5a'
)进行比较比尝试与十六进制值(0x5a
)进行比较更容易。如果要将字节转换为值,请尝试ord(inbyte)
这是您的代码的更新版本。为了避免串行超时,我将您的主代码放在循环中,并添加了if serial.inWaiting()
语句:
import serial
ser = serial.Serial('/dev/tty/AMA0', baudrate=1000000)
def findStart():
inbyte = ser.read(1)
print(inbyte)
if inbyte == b'\x5A':
print('Start byte found')
else:
print("Start byte not found")
while True: # endless loop
if serial.inWaiting():
findStart()
如果您确信在运行脚本时串行缓冲区中会有一些内容,那么可以将最后三行替换为
while serial.inWaiting():
findStart()
不幸的是,我正在谈论的设备是由其他人制造的,他们对波特率进行了编码,所以没有骰子。答案很有帮助,谢谢!