Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2019 07:18:52

seregka174
Зарегистрирован: 2015-02-03
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

GUI и чтение-запись в serial

Всем доброго времени.
На PyQT состряпал форму, к компьютеру по serial подключен arduino
подсобите как запустить функцию print_serial при поступлении данных в serial порт?
я как понимаю нужно опрос порта реализовать в потоке но вот как это сделать?

 import sys  # sys нужен для передачи argv в QApplication
from PyQt5 import QtWidgets
import design  # Это наш конвертированный файл дизайна
import serial #для работы с сериал соединением
ser=serial.Serial("/dev/ttyACM0",9600)  #change ACM number as found from ls /dev/tty/ACM*
ser.baudrate=9600
write_ser="Привет от PI!"
class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
    def __init__(self):
        # Это здесь нужно для доступа к переменным, методам
        # и т.д. в файле design.py
        super().__init__()
        self.setupUi(self)  # Это нужно для инициализации нашего дизайна
        self.pushButton.clicked.connect(self.write_arduino)  # Выполнить функцию write_arduino
                                                            # при нажатии кнопки
    def print_serial(self):
        """печать в listwidget"""
        read_ser=ser.readline()
        self.listWidget.addItem(read_ser)    
    def write_arduino(self):
        """функция обработки передачи данных в порт"""
        ser.write(write_ser.encode()) #Передача в порт с кодировкой encode
        self.listWidget.addItem(write_ser)
def main():
    app = QtWidgets.QApplication(sys.argv)  # Новый экземпляр QApplication
    window = ExampleApp()  # Создаём объект класса ExampleApp
    window.show()  # Показываем окно
    app.exec_()  # и запускаем приложение
    
if __name__ == '__main__':  # Если мы запускаем файл напрямую, а не импортируем
    main()  # то запускаем функцию main()



После знакомства с Linux заколотил все форточки.

Отредактировано seregka174 (Март 17, 2019 08:51:09)

Офлайн

#2 Март 17, 2019 13:18:12

seregka174
Зарегистрирован: 2015-02-03
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

GUI и чтение-запись в serial

Сделал вот так все гуд в консоль работает а в listwidget нет, ошибка

 import sys  # sys нужен для передачи argv в QApplication
from PyQt5 import QtWidgets
import design  # Это наш конвертированный файл дизайна
import threading
import time
import serial #для работы с сериал соединением
ser=serial.Serial("/dev/ttyACM0",9600)  #change ACM number as found from ls /dev/tty/ACM*
ser.baudrate=9600
write_ser="Привет от PI!"
class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
    def __init__(self):
        # Это здесь нужно для доступа к переменным, методам
        # и т.д. в файле design.py
        super().__init__()
        self.setupUi(self)  # Это нужно для инициализации нашего дизайна
        self.pushButton.clicked.connect(self.write_arduino)  # Выполнить функцию write_arduino при нажатии кнопки
    def write_arduino(self):
        """функция обработки передачи данных в порт"""
        ser.write(write_ser.encode()) #Передача в порт с кодировкой encode
        self.listWidget.addItem("Отправленно: "+write_ser)
        
    def print_serial(self):
        """печать в listwidget то что поступило на serial"""
        while 1:
            read_ser=ser.readline()
            if(read_ser!=""):
                print(read_ser)#вывод в консоль полученной строки
                self.listWidget.addItem("Пришло: "+read_ser)
            
    p1 = threading.Thread(target=print_serial, name="t1", args=["1"])
    p1.start()
def main():
    app = QtWidgets.QApplication(sys.argv)  # Новый экземпляр QApplication
    window = ExampleApp()  # Создаём объект класса ExampleApp
    window.show()  # Показываем окно
    app.exec_()  # и запускаем приложение
    
if __name__ == '__main__':  # Если мы запускаем файл напрямую, а не импортируем
    main()  # то запускаем функцию main()

Exception in thread t1:
Traceback (most recent call last):
File “/usr/lib/python3.6/threading.py”, line 916, in _bootstrap_inner
self.run()
File “/usr/lib/python3.6/threading.py”, line 864, in run
self._target(*self._args, **self._kwargs)
File “Потоки1.py”, line 33, in print_serial
self.listWidget.addItem(“Пришло: ”+read_ser)
AttributeError: ‘str’ object has no attribute ‘listWidget’



После знакомства с Linux заколотил все форточки.

Офлайн

#3 Март 17, 2019 18:12:32

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

GUI и чтение-запись в serial

seregka174
  p1 = threading.Thread(target=print_serial, name="t1", args=["1"])
а что это у вас за аргумент ‘1’? Ваш метод “print_serial(self)” имеет только один аргумент, это инстанс класса( он же self, он же окорок, он же одноногий… ). Оно вам все правильно пишет, вы же ему строку вместо инстанса вашего класса скармливаете, а у строки нет атрибута listWidget.
и вообще вот так :
  
class...
 
    p1 = threading.Thread(target=print_serial, name="t1", args=["1"])
    p1.start()
в данном случае делать абсолютно не нужно, и даже вредно. да и реализация в корне неправильная.
Если уж хотите чтото запустить в отдельном потоке то запускайте поток из инстанса, а не для класса глобально(по крайней мере в вашем конкретном случае ну вообще нет никакой необходимости зарускать отдельный поток для класса).
ИМХО, если уж используете PyQt то используйте qthread вместо threading, там есть нормальный механизм сингал-слот, чтобы ваш поток не лез в ГУИ.



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

Отредактировано PEHDOM (Март 17, 2019 18:39:02)

Офлайн

#4 Март 17, 2019 19:00:33

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

GUI и чтение-запись в serial

seregka174 Сначала сделай так что бы оно нормально отрабатывало, а потом потоки прикручивай. Иначе ты запутаешься.
P.S. Из патока менять что-то в GUI нельзя.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Март 17, 2019 19:58:31

seregka174
Зарегистрирован: 2015-02-03
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

GUI и чтение-запись в serial

Rodegast
seregka174 Сначала сделай так что бы оно нормально отрабатывало, а потом потоки прикручивай. Иначе ты запутаешься.P.S. Из патока менять что-то в GUI нельзя.
Так в том то и дело все работает отлично, просто не выводит в listwidget c ошибкой:
Exception in thread t1:
Traceback (most recent call last):
File “/usr/lib/python3.6/threading.py”, line 916, in _bootstrap_inner
self.run()
File “/usr/lib/python3.6/threading.py”, line 864, in run
self._target(*self._args, **self._kwargs)
File “Потоки1.py”, line 33, in print_serial
self.listWidget.addItem(“Пришло: ”+read_ser)
AttributeError: ‘str’ object has no attribute ‘listWidget’

У меня знаний совсем маловато я ели понимаю что такое класс, метод, атрибут я только учусь )



После знакомства с Linux заколотил все форточки.

Офлайн

#6 Март 18, 2019 09:39:57

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

GUI и чтение-запись в serial

seregka174
У меня знаний совсем маловато я ели понимаю что такое класс, метод, атрибут я только учусь )
чтото подобное вы и прошлый раз писали, может стоит наверстать пробелы в образовании?
вот тут очень хорошо, как по мне, описаны основы, и разжевано, что такое класс, атрибут и метод.
https://www.ibm.com/developerworks/ru/library/l-python_part_6/index.html
а вто тут уже чутка поглубже
https://www.ibm.com/developerworks/ru/library/l-python_part_7/
оно конечно для 2.6 , но во целом инфа не потеряла своей актуальности как для понимания основ.



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

Отредактировано PEHDOM (Март 18, 2019 09:41:48)

Офлайн

#7 Март 18, 2019 10:17:28

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

GUI и чтение-запись в serial

> Так в том то и дело все работает отлично

Ты серьёзно так думаешь? Например объект ser у тебя является глобальной переменной и нигде не закрывается. Метод write_arduino отправляет только строго определённый текст, а не текст вводимый пользователем. Вывод почему то идёт в listWidget, а не в QPlainText.

> просто не выводит в listwidget c ошибкой

Вот пример того как оно должно работать: http://python.su/forum/topic/24662/?page=2#post-130903



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version