如何解决重新实现 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 举报,一经查实,本站将立刻删除。