Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2015 20:32:44

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

Вопрос по serial и socket

Здравствуйте.
Прошу помочь и строго не судить я новичок.
Создал простое соединение.

Сервер:

import serial
import socket
ser = serial.Serial('/dev/ttyUSB0', 9600)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind( ("", 14900) )
sock.listen(1)
conn, addr = sock.accept()
while True:
   data = conn.recv(1024)
   if not data:
      break
   elif data == "w":
      ser.write("w")
   elif data == "s":
      ser.write("s")
   elif data == "a":
      ser.write("a")
   elif data == "d":
      ser.write("d")
   else:
      ser.write("j")
conn.close()

Клиент:
import socket
import sys
from PyQt4 import QtGui, QtCore
host = "Х.Х.Х.Х"
port = 14900
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
class Icon(QtGui.QWidget):
   def __init__(self, parent=None):
      QtGui.QWidget.__init__(self, parent)
      self.setGeometry(500, 100, 800, 800)
      self.setWindowTitle('TEST')
      self.setWindowIcon(QtGui.QIcon('icons/test.png'))
    def keyPressEvent(self, event):
      if event.key() == QtCore.Qt.Key_W :
         sock.send('w')
      elif event.key() == QtCore.Qt.Key_S :
         sock.send('s')
      elif event.key() == QtCore.Qt.Key_A :
         sock.send('a')
      elif event.key() == QtCore.Qt.Key_D :
         sock.send('d')
   def keyReleaseEvent(self, event):
      sock.send('j')
app = QtGui.QApplication(sys.argv)
icon = Icon()
icon.show()
sys.exit(app.exec_())

Не могу решить задачу передачу данных с сервера на клиент.
Застрял, на сервере считывание данных с COM порта в цикле.
Функция известна и она работает ser.readline(). Не понимаю как 2 цикла запустить на сервере или как поставить условия, что пока нет данных (команд) с клиента считывал и передавал инфу. с com порта.

Отредактировано Rustam96 (Май 11, 2015 20:33:54)

Офлайн

#2 Май 12, 2015 06:46:04

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

Вопрос по serial и socket

Может я не понятно объяснил?
Что я пробовал.
Если на сервере написать так

while True:
   print ser.readline()
while True:
   data = conn.recv(1024)
   if not data:
      break
То цикл передачи данных не работает, но первый цикл показывает данные с COM порта.
Если написать так
while True:
   print ser.readline()
   data = conn.recv(1024)
   if not data:
      break
Цикл передачи данных работает, но информация с COM порта считывается в рамках 1 прохода цикла (то есть если я нажму на клиенте кнопку “w” сработает цикл выполнится команда и считается информация с COM порта). Мне же нужно что бы считывание проходили постоянно, а не по нажатии кнопки.

Отредактировано Rustam96 (Май 12, 2015 06:47:35)

Офлайн

#3 Май 12, 2015 07:30:32

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

Вопрос по serial и socket

По идее, нужно сокет перевести в неблокирующий режим, а потом опрашивать его через select.
python.org. select



Офлайн

#4 Май 13, 2015 07:23:25

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

Вопрос по serial и socket

Спасибо.
Нашел статью с примерами.
Тему изучаю я .

Отредактировано Rustam96 (Май 14, 2015 07:35:20)

Офлайн

#5 Май 17, 2015 20:18:11

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

Вопрос по serial и socket

Переписал клиентскую часть

# -*- coding: utf-8 -*-
import socket
import sys
from PyQt4 import QtCore, QtGui
from PyQt4 import phonon
# Create a TCP/IP socket
host = "192.168.88.250"
port = 14900
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
class mainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(self.toUtf("TEST"))
        MainWindow.resize(1104, 836)
        self.main = QtGui.QWidget(MainWindow)
        MainWindow.setCentralWidget(self.main)
        MainWindow.move(140, 80)
        self.retranslateUi(MainWindow)
        self.keyPressEvent(MainWindow)
        self.keyReleaseEvent(MainWindow)
        
    def keyPressEvent(self, MainWindow):
        if MainWindow.key() == QtCore.Qt.Key_1 :
            sock.send('1')
        elif MainWindow.key() == QtCore.Qt.Key_2 :
            sock.send('2')
        elif MainWindow.key() == QtCore.Qt.Key_3 :
            sock.send('3')
        elif MainWindow.key() == QtCore.Qt.Key_4 :
            sock.send('4')
    def keyReleaseEvent(self, MainWindow):
        sock.send('j')
        
    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(self.toUtf("TEST"))
       
    def toUtf(self, text):
        # та самая функция перевода
        return QtGui.QApplication.translate("MainWindow", text, None, QtGui.QApplication.UnicodeUTF8)
def init():
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    form = mainWindow()
    form.setupUi(MainWindow)
    return app, form, MainWindow
Запускаю кодом
# -*- coding: utf-8 -*-
import sys
from forms import MainForm
 
def main():
    app, mainForm, window = MainForm.init() 
    window.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    main()
Ошибку выдает
if MainWindow.key() == QtCore.Qt.Key_1 :
AttributeError: ‘QMainWindow’ object has no attribute ‘key’
В связи отсутствием опыта даже идей нет.
Подскажите в каком направлении думать.

Отредактировано Rustam96 (Май 17, 2015 20:21:57)

Офлайн

#6 Май 17, 2015 23:19:41

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Вопрос по serial и socket

а зачем вы вызывает?

self.keyPressEvent(MainWindow)



————————————————
-*- Simple is better than complex -*-

Офлайн

#7 Май 18, 2015 08:55:39

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

Вопрос по serial и socket

Так хоть ошибку выдает
По другому вообще не работает, просто игнорирует.

Отредактировано Rustam96 (Май 18, 2015 21:09:36)

Офлайн

#8 Май 18, 2015 21:18:23

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

Вопрос по serial и socket

Если я правильно понимаю при вызове функции интерпритатор понимает функцию keyPressEvent(MainWindow) не как функцию qt библиотеки, а как функцию которую я сам написал.
То есть если бы я написал не keyPressEvent(MainWindow), а event(MainWindow) и вызвол бы ее в setupUi это было бы равнозначно.
Это объясняет почему он ругается на атрибут key.
Но как заставить работать команды клавиш?

Офлайн

#9 Май 18, 2015 23:23:55

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

Вопрос по serial и socket

Rustam96
То есть если бы я написал не keyPressEvent(MainWindow), а event(MainWindow) и вызвол бы ее в setupUi это было бы равнозначно.
Метод keyPressEvent() не просто какой-то метод. Это служебный метод, который неявно вызывается в цикле обработки событий при нажатии любой клавиши.

Rustam96
Переписал клиентскую часть
Прочитай какую-нибудь книжку по Qt, писать наугад в этом деле - пустая трата времени.



Офлайн

#10 Май 19, 2015 12:59:02

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

Вопрос по serial и socket

Если вы имели ввиду http://pyqt.sourceforge.net/Docs/PyQt4/classes.html то я им и пользуюсь.
Если другую книгу то посоветуйте.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version