2016-07-09 12 views
0

Ok, also habe ich eine UDP-Socket-Setup zwischen zwei Computern. Ein Computer erhält Koordinaten von einem Joystick und sendet sie als Array über den Sockel. Am anderen Ende wird das Array empfangen und dann wird der Wert an ein Servo gesendet. Das Problem ist, dass das für etwa 10 Sekunden funktioniert und dann die gesamten Verbindungen auf der Empfängerseite (in diesem Fall ein RPI) abstürzen, und ich muss es neu starten. Wenn jemand eine Lösung finden könnte, die anschwellen würde. Code unten.Ethernet-Verbindung stürzt ab, wenn Python-Socket verwendet

import socket 
import time 
import pygame 
try: 
    import cPickle as pickle 
except: 
    import pickle 
from pygame.locals import * 
pygame.init() 

#Initiate Some Variables 
IP = "x.x.x.x" 
Port = "5000" 
crashed = False 
connectionID = "123456789" 
clock = pygame.time.Clock() 
ready = True 

#Initalize Joystick 
pygame.init() 
pygame.joystick.init() # main joystick device system 

try: 
    j = pygame.joystick.Joystick(0) # create a joystick instance 
    j.init() # init instance 
    print ('Enabled joystick: ' + j.get_name()) 
except pygame.error: 
    print ('no joystick found.') 

m = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

while True: 
    if ready: 
     pycontrol = pygame.event.get() 

     #Get Joystick Pos 
     x = j.get_axis(0) 
     y = j.get_axis(1) 
     s = j.get_axis(2) 
     z = j.get_axis(3) 

     #Set Buttons To 0 
     JoyButton_0 = 0 
     JoyButton_1 = 0 
     JoyButton_2 = 0 
     JoyButton_3 = 0 
     JoyButton_4 = 0 
     JoyButton_5 = 0 
     JoyButton_6 = 0 

     #Lets do some math 
     #Create cubic graph y=x^3 
     #And a linear 
     cubic_x = (x**3)*100 
     cubic_y = (y**3)*100 
     linear_s = ((-0.5*s+1)-0.5)*100 
     linear_z = (z**3)*100 
     data_x = round(cubic_x, 0) 
     data_y = round(cubic_y, 0) 
     data_s = round(linear_s, 0) 
     data_z = round(linear_z, 0) 

     #Get Joystick Key Events 
     for event in pycontrol: 
      if event.type == pygame.QUIT: 
       crashed = True 

      ############################ 
      if event.type == pygame.JOYBUTTONDOWN: 
       if 1 == j.get_button(0): 
        JoyButton_0 = 1 
       if 1 == j.get_button(1): 
        JoyButton_1 = 1 
       if 1 == j.get_button(2): 
        JoyButton_2 = 1 
      ###################### 

     #Turn into array and steralize it 
     array = (data_x, data_y, data_s, data_z, JoyButton_0, JoyButton_1, JoyButton_2) 
     print (array) 
     #Pickle Array and set Protocol to 2 to be read by RPI 
     send_array = pickle.dumps(array, protocol=2) 
     m.sendto(send_array, (IP,5000)) 
     time.sleep(0.05) 

Nun, da für das Senden von Ende war, ist hier das Empfangsende

#!/usr/bin/python 

from Adafruit_PWM_Servo_Driver import PWM 
import time 

import socket 
try: 
    import cPickle as pickle 
except: 
    import pickle 

# Setup Variables & Socket 
IP = '192.168.0.122' 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.bind((IP, 5000)) 
print ("Ready") 
servoMin = 150 # Min pulse length out of 4096 
servoMax = 600 # Max pulse length out of 4096 

# Initialise the PWM device using the default address 
pwm = PWM(0x40) 
# Note if you'd like more debug output you can instead run: 
#pwm = PWM(0x40, debug=True) 
pwm.setPWMFreq(60) # Set the Frequency to 60hz 

while True: 
    raw_message,data = s.recvfrom(1024) 
    (data_x, data_y, data_s, data_z, JoyButton_0, JoyButton_1, JoyButton_2) = pickle.loads(raw_message) 
    if JoyButton_0 == 1: 
     print("heelo") 
    if JoyButton_1 == 1: 
     print("Potato") 
    if JoyButton_2 == 1: 
     print("Dog") 

    Aileron_Servo = (2.25*data_x)+375 
    Elevator_Servo = (2.25*data_y)+375 
    Throttle_Servo = (4.5*data_s)+150 
    Rudder_Servo = (2.25*data_z)+375 


    if 150 <= Aileron_Servo <= 600: 
     Servo0 = Alieron_Servo 
     pwm.setPWM(0, 0, Servo0) 
    time.sleep(1) 
+0

Der Empfänger wird möglicherweise mit Daten vom Sender überflutet. Versuchen Sie, die gesendeten Daten zurückzudrängen oder einige Pakete zu löschen. Wir benötigen mehr Informationen über die Fehler, die Sie bekommen. Systemprotokolle können hilfreich sein. –

+0

Ok ich sehe, ob ich die Systemprotokolle in einer Minute holen kann. Aber die Verbindung scheint offen zu bleiben, bis ich versuche, den Servomotor zu bewegen, so dass möglicherweise der Servotreiber das Problem ist. Aber ich sehe nicht, wie das die Verbindung zum Absturz bringen würde. Und wie beim Absturz der Verbindung meine ich, dass die IP-Adresse und alles weg ist und nicht bis zu einem Neustart zurückkommt. Nur um es zu klären. – ferret249

Antwort

0

ich Sie schläft haben sehen, aber sie stimmen nicht überein. Der Sender schläft 0,05 Sekunden und Ihr Empfänger schläft 1 Sekunde. Dies erzeugt wahrscheinlich einen Pufferüberlauf.

+0

Alle TCP-Verbindung hat 50ms Verzögerung ohne irgendeine Erklärung (wenn Ethernet nicht auf Hardware-Ebene verwenden). Dies ist der richtige Punkt (Überlauf), er benötigt einige send-recv-Mülldaten (verwendeter Socket-Einwegstil). – dsgdfg

+0

Die Verbindung ist eine UDP-Verbindung, daher ist sie wahrscheinlich viel schneller als TCP. Und was macht das Senden der Mülldaten? – ferret249