Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何从串行数据中提取特定序列_Python 3.x_Pyserial - Fatal编程技术网

Python 3.x 如何从串行数据中提取特定序列

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

我正在尝试使用pyserial api从raspberry pi 3读取一些串行数据,我需要特定序列中的数据,例如3xx7xxxbxxxxx,但是,有时数据流从EXxxxx7xxxbxxx开始,如何确保无论数据流以何种方式进入,我始终读取正确的序列

这用于从特殊泵应用中使用的控制卡读取数据

导入序列号
导入时间
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等开始,并且序列中可能出现多次不一定代表正确序列开始的数字。