Я расширяю программу с графическим интерфейсом для робота с дистанционным управлением.Идея состоит в том, чтобы запрограммировать простой клиент с графическим интерфейсом на Python, который подключается к удаленному серверу, также написанному на Python.Клиент отправляет простые сообщения на сервер, сервер получает сообщение, а затем передает его через последовательный порт на Arduino Mega , который подключен через USB.
Я получил кодна работу, вроде.
Прямо сейчас я могу подключиться один раз из моего клиентского Python GUI, отправить одно сообщение, затем он теряет соединение.Затем я должен остановить сервер, перезапустить его и отправить еще одно сообщение.
Что здесь происходит?
Вот сценарий сервера, принятый из другого источника.
import serial
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 9000))
sock.listen(1)
print "Listening on TCP 9000"
motor = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
print "Connected to Arduino Mega at: /dev/ttyUSB0"
while(1):
print "Waiting For Connection..."
connection, addr = sock.accept()
connection.setblocking(0)
print "Connected by", addr[0]
while(1):
try:
sockdata = connection.recv(1)
break
except:
pass
if sockdata == 'X':
print "Exiting"
break
if sockdata == '0':
print "Stopping"
motor.write(sockdata)
if sockdata == '1':
print "Forward"
motor.write(sockdata)
if sockdata == '2':
print "Left"
motor.write(sockdata)
if sockdata == '3':
print "Right"
motor.write(sockdata)
if sockdata == '4':
motor.write(sockdata)
print "Backwards"
else:
pass
А вот мой код клиента, за исключением, конечно, файла ресурсов.
from socket import *
from PythonCard import model
HOST = ''
PORT = 9000
ADDR = (HOST,PORT)
Client = socket (AF_INET,SOCK_STREAM)
Client.connect((ADDR))
class MainWindow(model.Background):
def on_FwdBtn_mouseClick(self, event):
Client.send('1')
def on_LftBtn_mouseClick(self, event):
Client.send('2')
def on_RitBtn_mouseClick(self, event):
Client.send('3')
def on_RevBtn_mouseClick(self, event):
Client.send('4')
def on_StpBtn_mouseClick(self, event):
Client.send('0')
def on_GetPing_mouseClick(self, event):
Client.send('~')
app = model.Application(MainWindow)
app.MainLoop()
РЕДАКТИРОВАТЬ
После изучения нижеисправления или, по крайней мере, некоторые из них, вот мой код для сервера, клиент остается прежним.
import serial
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 9001))
sock.listen(1)
print "Listening on TCP 9001"
motor = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
print "Connected to Motor Controller: /dev/ttyUSB0"
print "Waiting For Connection..."
connection, addr = sock.accept()
connection.setblocking(0)
while(1):
print "Connected by", addr[0]
while(1):
try:
sockdata = connection.recv(1024)
break
except:
pass
if sockdata == 'X':
print "Exiting"
break
if sockdata == '0':
print "Stopping"
motor.write(sockdata)
if sockdata == '1':
print "Forward"
motor.write(sockdata)
if sockdata == '2':
print "Left"
motor.write(sockdata)
if sockdata == '3':
print "Right"
motor.write(sockdata)
if sockdata == '4':
motor.write(sockdata)
print "Backwards"
else:
pass
Это работает немного лучше, но все же не правильно, я не думаю.Когда я запускаю это, я запускаю сервер, и после запуска моего графического интерфейса я могу наблюдать за моим терминальным окном на сервере и получать фактические команды, когда они поступают через
". Подключено с 127.0.0.1."" Вперед "" Подключено с 127.0.0.1 "" left "" Подключено с 127.0.0.1 "" right "" Подключено с 127.0.0.1 "
Выглядит так, как будто каждый раз, когда я посылаю командуЯ переподключился.Я хочу поддерживать соединение, как только я запускаю свой графический интерфейс, а не отключать и заново подключаться при каждой отправке команды.Извините, если я звучу глупо, но я только начал работать с Python около трех недель назад.