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() 这不是我想要它做的,因为我希望它读取一个字节,然后转

我正在用python编写一些代码来从串行端口读取字节,我需要从缓冲区中找到一个特定的字节。目前我的代码是:

导入序列号
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()

不幸的是,我正在谈论的设备是由其他人制造的,他们对波特率进行了编码,所以没有骰子。答案很有帮助,谢谢!