【问题标题】:How to prevent Python + PySerial from reading the wrong starting byte如何防止 Python + PySerial 读取错误的起始字节
【发布时间】:2018-01-19 03:28:14
【问题描述】:

所以我目前正在处理 Python 3 和 PySerial 的一个小问题。我有一个 Raspberry Pi 和一个通过 RPI 上的 UART 端口连接的控制盒。控制框每 50 毫秒向树莓派发送一次数据,我想读取该数据,以便使用解析器从中获取一些需要的数据。唯一的问题是当我尝试读取数据时,起始十六进制值不正确,因为我开始读取控制箱发送回的反馈中途的数据。

例如:

b'\x21\x21\x22\x98\x98\x24\x23\x21\x21\x22\x22\x98

我需要 x98 (0x98) 作为该字节的起始十六进制值,所以它看起来像这样

x98\x98\x24\x23\x21\x21\x22\x22\

我需要这样,这样我才能获取某个十六进制代码(从字节中),例如 x21 并将其用于我的程序。我已经进行了研究,但无法提出一件事。我应该怎么做才能使这成为可能?

【问题讨论】:

  • 您应该缓冲读取的字节并在开始标记字节处拆分它们。
  • 我研究了在 python 上缓冲字节,我得到的最接近的是python struct。我不知道该怎么做。我可以举一个简单的例子吗?谢谢。

标签: python hex pyserial uart


【解决方案1】:

您需要一个函数,最好是线程化的,从串行端口读取数据并将数据放入队列。然后,您从队列中一次获取一个字节,然后对这些数据执行您想要执行的操作。

import serial
import _thread as thread
import queue

serialport = serial.Serial('COM1')
queue_in = queue.Queue()

def run_serial_input():
    input = serialport.readall()
    for byte in input:
        queue_in.put(byte)

thread.start_new_thread(run_serial_input(), ())

while True:
    # Do things with your bytes....
    byte = queue_in.get()
    if byte == 0x98:
        pass

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多