微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重新实现 QSerialPort canReadLine() 和 readLine() 方法

如何解决重新实现 QSerialPort canReadLine() 和 readLine() 方法

我正在尝试通过 QSerialPort 使用值 0 作为异步模式下的分隔符(使用信号而不是轮询)接收自定义成帧的原始字节。

不便之处在于 QSerialPort 似乎没有可以读取串行数据的方法,直到遇到指定的字节值,例如pyserial 中的 read_until (delimiter_value)。

我想知道是否可以在 Python 中重新实现 QSerialPort 的 readLine() 函数,以便它读取直到遇到 0 字节值而不是 '\n'。同样,重新实现 canReadLine() 也会很方便。

我知道可以使用 readAll() 方法然后解析数据以获取分隔符值。但是这种方法可能意味着更多的代码和效率的降低。我希望在处理帧时尽可能降低开销(串行波特率和传入字节数很大)。但是,如果您知道一种快速方法,我想看看。

解决方法

我最终解析了框架,它似乎工作得很好。 下面是从我的脚本中提取的一个方法,它异步接收和解析串行数据。 self.serial_buffer 是在自定义类 init 方法中初始化的 QByteArray 数组。您也可以使用全局声明的字节数组,但您必须以另一种方式检查分隔符值。

@pyqtSlot()
def receive(self):
    self.serial_buffer += self.serial.readAll()   # Read all data from serial buffer

    start_pos,del_pos = 0,0
    while True:
        del_pos = self.serial_buffer.indexOf(b'\x00',start_pos)   # b'\x00' is delimiter byte
        if del_pos == -1: break   # del_pos is -1 if b'\x00' is not found
        frame = self.serial_buffer[start_pos: del_pos]   # Copy data until delimiter
        start_pos = del_pos + 1   # Exclude old delimiter from your search
        self.serial_buffer = self.serial_buffer[start_pos:]   # Copy remaining data excluding frame
        self.process_frame(frame)   # Process frame

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。