Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 27, 2015 21:23:59

nanotroll
Зарегистрирован: 2015-10-25
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyqt4 qslider + socket + raspberry pi

Добрый вечер!

Помогите пожалуйста разобраться с ошибкой. Задача состоит в том, чтобы регулировать положение сервопривода, подключенного к raspberry pi с помощью ползунка (QSlider). Минимальное значение ползунка - 0, Максимальное - 180. Я хочу сделать так, чтобы программа с графическим интерфейсом (клиент) запускалась на ПК, передавала команды на raspberry pi (сервер), а уже тут происходила обработка.
Мой кривой код почти работает. Проблема в том, что если быстро менять значение угла (резко потянуть ползунок), происходит ошибка "ConnectionAbortedError: Программа на вашем хост-компьютере разорвала установленное подключение". Я полагаю, ошибка где-то в методе changevalue().

Собственно может быть кто-то подскажет как лучше переписать код, чтобы исправить данную ошибку. Привожу код клиента:

#CLIENT
import sys
import time
from PyQt4 import QtGui, QtCore
import socket

HOST = '192.168.1.101'
PORT = 8080
ADDR = (HOST, PORT)

class Main_Window(QtGui.QWidget):
def __init__(self, soc, parent=None):
QtGui.QWidget.__init__(self, parent)

self.s = soc

self.setWindowTitle('Servo controlling')

font = QtGui.QFont("Times", 18, QtGui.QFont.Bold)

self.label = QtGui.QLabel()
self.label.setNum(90)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setFont(font)

self.slider = QtGui.QSlider(QtCore.Qt.Horizontal)
self.slider.setMinimum(0)
self.slider.setMaximum(180)
self.slider.setValue(90)
self.slider.valueChanged.connect(self.changevalue)

self.stop_button = QtGui.QPushButton('Stop')
self.stop_button.clicked.connect(self.stop_server)

layout = QtGui.QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.slider)
layout.addWidget(self.stop_button)

self.setLayout(layout)

self.resize(250, 150)

def changevalue(self):
sld_value = self.slider.value()
self.label.setNum(sld_value)

data = float(sld_value) * 0.055 + 2.5

data_str = str(data)
print(data_str)
self.s.send(data_str.encode())
time.sleep(0.07)

def stop_server(self):
data = '5'
self.s.send(data.encode())

try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(ADDR)

app = QtGui.QApplication(sys.argv)
window = Main_Window(s)
window.show()
except:
print("ERROR!!1")
finally:
sys.exit(app.exec_())

Офлайн

#2 Ноя. 28, 2015 05:51:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Pyqt4 qslider + socket + raspberry pi

nanotroll
Проблема в том, что если быстро менять значение угла (резко потянуть ползунок), происходит ошибка "ConnectionAbortedError
time.sleep() лучше не использовать в оконных программах, он может не срабатывать.
По идее, у тебя должен быть отдельный поток, который из очереди сообщений извлекает и отправляет сообщения с задержкой.
Он может и только самое последнее брать.
Когда двигаешь ползунок, посылаются тысячи сигналов его движения.



Отредактировано py.user.next (Ноя. 28, 2015 05:52:58)

Офлайн

#3 Ноя. 28, 2015 14:26:20

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

Pyqt4 qslider + socket + raspberry pi

> time.sleep() лучше не использовать в оконных программах, он может не срабатывать.

Он срабатывает, но обычный sleep не может обрабатывать малые задержки. По этому нужно использовать msleep:

QtCore.QThread.msleep(70)



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

Отредактировано Rodegast (Ноя. 28, 2015 14:26:59)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version