Уведомления

Группа в Telegram: @pythonsu

#1 Май 2, 2019 11:20:13

vic57
Зарегистрирован: 2015-07-07
Сообщения: 903
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQT5 и com port

в Qt надо делать через сигнал/слот
https://evileg.com/ru/post/290/
https://github.com/qt/qtserialport/tree/5.12/examples/serialport
примеры на С++, но разобраться несложно

Офлайн

#2 Май 2, 2019 11:31:02

banzayy
Зарегистрирован: 2019-04-30
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT5 и com port

попробую. спс за подсказку
А на будущее всё равно вопрос интересный, можно ли остановить запушенный поток?

отредактировал. Всё отлично получилось. Причём доку я читал и waitForReadyRead я видел, только не до конца раздуплил как его применить. Я просто раньше только под микроконтроллеры кое-что писал, а на такие вещи только сейчас решился попробовать.

Отредактировано banzayy (Май 2, 2019 15:03:07)

Офлайн

#3 Май 2, 2019 15:47:59

vic57
Зарегистрирован: 2015-07-07
Сообщения: 903
Репутация: +  126  -
Профиль   Отправить e-mail  

Офлайн

#4 Май 3, 2019 08:32:50

banzayy
Зарегистрирован: 2019-04-30
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT5 и com port

с портами окончательно оформилось так

 from PyQt5.QtCore import pyqtSignal, QThread, QIODevice
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo
class SerialThreadClass(QThread):
    rx_signal = pyqtSignal(bytes)
    def __init__(self, port, parent=None):
        super(SerialThreadClass, self).__init__(parent)
        # open the serial port
        self.serport = QSerialPort()
        self.serport.setBaudRate(14400)
        self.serport.setPortName(port)
        self.serport.open(QIODevice.ReadWrite)
    def run(self):
        # Устанавливаем таймаут на приём в 2 секунды
        if self.serport.waitForReadyRead(1000):
            # Принимаем данные
            rx_data = self.serport.readLine()
            # Если данные приняты, передаём их с сигналом
            if len(rx_data) > 0:
                self.rx_signal.emit(bytes(rx_data))
        # При наступлении таймаута передаём сигнал об ошибке
        else:
            rx_data = [0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1]
            self.rx_signal.emit(bytes(rx_data))
    # Передача данных через порт
    def senddata(self, data):
        tx_data = bytes(data)
        self.serport.write(tx_data)
# Определяем доступные в системе порты
class SerialInfoClass(QSerialPortInfo):
    def __init__(self, parent=None):
        super(SerialInfoClass, self).__init__(parent)
    def avaliable_ports(self):
        avaliable_comport_list = ['']
        self.my_ports = QSerialPortInfo()
        ports = self.my_ports.availablePorts()
        for port in ports:
            port_name = port.portName()
            avaliable_comport_list.append(port_name)
        return avaliable_comport_list

Отредактировано banzayy (Май 3, 2019 19:53:48)

Офлайн

#5 Май 3, 2019 09:37:50

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQT5 и com port

banzayy
А на будущее всё равно вопрос интересный, можно ли остановить запушенный поток?
а чего же
https://doc.qt.io/qt-5/qthread.html#quit
там есть методы quit(), exit() и terminate(). все зависит от того как вы реализовали свой поток. Если с первыми двумя могут быть сложности в использовании то последний прерывает поток без всяких вопросов. Правда эта функция является опасной и ее использование не рекомендуется. Поток может быть прерван в любой точке алгоритма. Потоки могут быть прерваны во время изменения данных. Нет никаких шансов того, что поток произведет очистку за собой, разблокирует любые удерживаемые мьютексы и т.д. Словом, используйте эту функцию только в случае крайней необходимости. Лучше таки сразу предусмотреть выход из потока иными средствами.

banzayy
# Устанавливаем таймаут на приём в 2 секунды
if self.serport.waitForReadyRead(1000):
так всетаки две или одну?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 3, 2019 09:46:25)

Офлайн

#6 Май 3, 2019 10:02:38

banzayy
Зарегистрирован: 2019-04-30
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT5 и com port

это будет ещё подбираться, оборудование ещё не готово. пока остановился на 1 секунде. Доделается в металле, установятся микроконтроллерные платы в оборудование (может ардуино, может что-то на stm32f103) и будет по итогам видно

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version