Python 3.x 如何从串行数据中提取特定序列
我正在尝试使用pyserial api从raspberry pi 3读取一些串行数据,我需要特定序列中的数据,例如3xx7xxxbxxxxx,但是,有时数据流从EXxxxx7xxxbxxx开始,如何确保无论数据流以何种方式进入,我始终读取正确的序列 这用于从特殊泵应用中使用的控制卡读取数据Python 3.x 如何从串行数据中提取特定序列,python-3.x,pyserial,Python 3.x,Pyserial,我正在尝试使用pyserial api从raspberry pi 3读取一些串行数据,我需要特定序列中的数据,例如3xx7xxxbxxxxx,但是,有时数据流从EXxxxx7xxxbxxx开始,如何确保无论数据流以何种方式进入,我始终读取正确的序列 这用于从特殊泵应用中使用的控制卡读取数据 导入序列号 导入时间 ser=串行。串行( 端口='/dev/ttyACM0', 波特率=9600, 奇偶校验=串行。奇偶校验\u无, 停止位=seial.stoppits\u ONE, bytesize=s
导入序列号
导入时间
ser=串行。串行(
端口='/dev/ttyACM0',
波特率=9600,
奇偶校验=串行。奇偶校验\u无,
停止位=seial.stoppits\u ONE,
bytesize=serial.EIGHTBITS,
超时=1
)
time.sleep=1
尝试:
而1:
如果ser.inWaiting()大于0:
数据=序列读取(8)
打印(data.hex())
这给了我3xx7xxxxxxxxx的结果,有时它从7xxx或Exxx开始,无论流从何处开始,我始终希望能够提取序列3xxx7xxxbxxxxxx。假设用于确定序列开始的标记是一个完整字节
0x30
,您可以尝试以下代码。它将一次读取一个字节,直到找到开始标记。然后它将读取另外7个字节并附加它们:
import serial
import time
ser = serial.Serial(
port = '/dev/ttyACM0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = seial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
timeout = 1
)
time.sleep = 1
start_marker = b'\xE0'
try:
while 1:
if ser.inWaiting() > 0:
data = ser.read(1)
if data != start_marker:
continue
data += ser.read(7)
print(data.hex())
编辑
请尝试此代码以匹配每个字节对的最高有效4位:
import serial
import time
ser = serial.Serial(
port = '/dev/ttyACM0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = seial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
timeout = 1
)
time.sleep = 1
data = bytes()
try:
while 1:
if ser.inWaiting() > 0:
data += ser.read(1)
if len(data) < 8:
continue
if len(data) > 8:
data = data[-8:]
if not (
data[0] >> 4 == 0x3 and
data[2] >> 4 == 0x7 and
data[4] >> 4 == 0xB and
data[6] >> 4 == 0xE
):
continue
print(data.hex())
导入序列号
导入时间
ser=串行。串行(
端口='/dev/ttyACM0',
波特率=9600,
奇偶校验=串行。奇偶校验\u无,
停止位=seial.stoppits\u ONE,
bytesize=serial.EIGHTBITS,
超时=1
)
time.sleep=1
数据=字节()
尝试:
而1:
如果ser.inWaiting()大于0:
数据+=序列读取(1)
如果len(数据)<8:
持续
如果len(数据)>8:
数据=数据[-8:]
如果不是(
数据[0]>>4==0x3和
数据[2]>>4==0x7和
数据[4]>>4==0xB和
数据[6]>>4==0xE
):
持续
打印(data.hex())
假设用于确定序列开始的标记是一个完整字节0x30
,您可以尝试以下代码。它将一次读取一个字节,直到找到开始标记。然后它将读取另外7个字节并附加它们:
import serial
import time
ser = serial.Serial(
port = '/dev/ttyACM0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = seial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
timeout = 1
)
time.sleep = 1
start_marker = b'\xE0'
try:
while 1:
if ser.inWaiting() > 0:
data = ser.read(1)
if data != start_marker:
continue
data += ser.read(7)
print(data.hex())
编辑
请尝试此代码以匹配每个字节对的最高有效4位:
import serial
import time
ser = serial.Serial(
port = '/dev/ttyACM0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = seial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
timeout = 1
)
time.sleep = 1
data = bytes()
try:
while 1:
if ser.inWaiting() > 0:
data += ser.read(1)
if len(data) < 8:
continue
if len(data) > 8:
data = data[-8:]
if not (
data[0] >> 4 == 0x3 and
data[2] >> 4 == 0x7 and
data[4] >> 4 == 0xB and
data[6] >> 4 == 0xE
):
continue
print(data.hex())
导入序列号
导入时间
ser=串行。串行(
端口='/dev/ttyACM0',
波特率=9600,
奇偶校验=串行。奇偶校验\u无,
停止位=seial.stoppits\u ONE,
bytesize=serial.EIGHTBITS,
超时=1
)
time.sleep=1
数据=字节()
尝试:
而1:
如果ser.inWaiting()大于0:
数据+=序列读取(1)
如果len(数据)<8:
持续
如果len(数据)>8:
数据=数据[-8:]
如果不是(
数据[0]>>4==0x3和
数据[2]>>4==0x7和
数据[4]>>4==0xB和
数据[6]>>4==0xE
):
持续
打印(data.hex())
也许比特屏蔽是一种方法,但我不熟悉。请帮帮我。也许比特掩蔽是一种方法,但我对它不熟悉。请帮助。谢谢,但此解决方案找不到序列的开头。一个完整字节可以从exxx3xxx等开始,并且序列中可能出现多次数字,这些数字不一定代表正确序列的开始。谢谢,但此解决方案找不到序列的开始。一个完整字节可以从exxx3xxx等开始,并且序列中可能出现多次不一定代表正确序列开始的数字。