pyqt5 多线程接收串口16进制数据的例子
时间: 2023-06-10 08:03:08 浏览: 271
Python使用线程来接收串口数据的示例
您好,以下是一个使用PyQt5多线程接收串口16进制数据的示例代码:
```python
from PyQt5.QtCore import QThread, pyqtSignal, QByteArray
import serial
import time
class SerialThread(QThread):
receive_signal = pyqtSignal(QByteArray)
def __init__(self, port, baudrate):
super().__init__()
self.port = port
self.baudrate = baudrate
self.serial_port = None
def run(self):
self.serial_port = serial.Serial(self.port, self.baudrate, timeout=1)
while True:
if self.serial_port.isOpen():
data = self.serial_port.read(1024)
if data:
hex_data = data.hex()
hex_data = ' '.join([hex_data[i:i+2] for i in range(0, len(hex_data), 2)])
self.receive_signal.emit(QByteArray.fromHex(hex_data.encode()))
else:
time.sleep(1)
def stop(self):
self.serial_port.close()
```
该代码定义了一个线程类SerialThread,用于打开串口,读取并发送接收到的数据。
在首先使用serial模块打开指定的串口,然后在while循环中不停的读取串口数据,并将其转化为16进制格式,将16进制数据通过信号emit到主线程。
在主窗口类中,可以通过如下代码启动串口线程并接收串口数据:
```python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QByteArray
from serial_thread import SerialThread
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建串口线程
self.serial_thread = SerialThread(port='COM1', baudrate=115200)
self.serial_thread.receive_signal.connect(self.receive_data)
self.serial_thread.start()
def receive_data(self, data: QByteArray):
# 处理接收到的16进制数据
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在主线程的构造函数中,创建一个SerialThread线程对象,并将其receive_signal信号与自己的一个槽函数receive_data连接起来,在receive_data中可以处理接收到的16进制数据。
通过start方法启动串口线程后,当有数据从串口输入到电脑的时候,SerialThread会自动触发receive_signal信号,将接收到的数据emit到主线程,从而可以对接收到的数据进行处理。
希望对您有所帮助!
阅读全文