2016-10-22 2 views
0

Ich versuche, Strings zwischen zwei Raspberry Pis über UART zu senden. Bisher kann ein Pi eine Zeichenfolge übertragen und der zweite Pi kann nur empfangen. Ich versuche einen "Befehl" von einem Pi zum anderen zu senden, dann empfängt der zweite Pi den "Befehl" und sendet dann "Sensordaten" zurück zum ersten Pi. Dies scheint jedoch nicht zu funktionieren. Ich kann keine Daten senden und empfangen.Python UART zwischen 2 Raspberry Pis

Jede Hilfe würde sehr geschätzt werden.

The Raspberry Pi, der den Befehl sendet:

import serial 

ser = serial.Serial(
    port = '/dev/ttyAMA0',\ 
    baudrate = 115200,\ 
    bytesize = serial.EIGHTBITS,\ 
    timeout = 0) 

dat = '' 

while True: 
    #asks user for input 
    command = raw_input() 
    #terminates command with null 
    ser.write(command + '\0') 

    #reads data per char 
    for c in ser.read(): 
     #appends string 
     dat += c 
     #terminates at null char 
     if c == '\0': 
      print(dat) 
      dat = '' 
      break 
ser.close() 

Dieser RPi, die Befehl empfängt und sendet dann Daten Sensor:

import serial 

ser = serial.Serial(
    '/dev/ttyAMA0' ,\ 
    baudrate = 115200 ,\ 
    bytesize = serial.EIGHTBITS ,\ 
    timeout = 0) 

dat = '' 
sen1 = 'sen1\x00' 
sen2 = 'sen2\x00' 
com1 = 'hello' 
com2 = 'this thing works!' 
com3 = 'error!' 

while True: 

    #reads data per char 
    for c in ser.read(): 
    #appends string 
    dat += c 
    #terminates at null char 
    if c == '\0': 
     #decides which sensor to choose 
     if dat == sen1: 
      print(com1) 
      ser.write(com1 + '\0') 
      dat = '' 
      break 
     elif dat == sen2: 
      print(com2) 
      ser.write(com2 + '\0') 
      dat = '' 
      break 
     else: 
      print(com3) 
      ser.write(com3 + '\0') 
      dat = ''   

ser.close() 

Antwort

0

Die Ursache ist wahrscheinlich Ihre Null-Timeout. Sie haben read() als nicht blockierend festgelegt, so dass die for Loops Ihres Absenders höchstwahrscheinlich nichts (oder nur ein Byte) lesen und enden werden, bevor alles angekommen ist. Auch das Iterieren über ser.read() macht keinen Sinn, da es standardmäßig nur ein Byte zurückgibt.

Zeitüberschreitung auf einen Wert ungleich Null erhöhen.

ser = serial.Serial(
    '/dev/ttyAMA0' ,\ 
    baudrate = 115200 ,\ 
    bytesize = serial.EIGHTBITS ,\ 
    timeout = 0.1) 

Angenommen, Sie die Antwort auf einen Befehl empfangen möchten, bevor ein anderer Befehl gesendet wird, sollte dies für den Sender arbeiten:

while True: 
    #asks user for input 
    command = raw_input() 
    #terminates command with null 
    ser.write(command + '\0') 

    dat = [] 
    lastRead = time.time() 
    while time.time() - lastRead < 0.1: 
     while ser.inWaiting() > 0: 
      dat.append(ser.read()) 
      lastRead = time.time() 
    if dat and (dat[-1] == '\0'): 
     print(''.join(dat[:-1])) 

Wenn 100ms oder mehreren Stichen, bevor ein anderes Byte verfügbar ist, die während Schleife bricht und das letzte empfangene Byte wird überprüft, um zu wissen, ob es ein Nullbyte ist. Etwas Ähnliches sollte für Ihren Empfänger funktionieren:

while True: 
    dat = [] 
    lastRead = time.time() 
    while time.time() - lastRead < 0.1: 
     while ser.inWaiting() > 0: 
      dat.append(ser.read()) 
      lastRead = time.time() 
    dat = ''.join(dat) 
    # begin your comparisons here 
+0

Vielen Dank für die Antwort. Leider hat dein Code bei mir nicht funktioniert. – Patattack760

+0

inter_byte_timeout würde nicht kompilieren. Nach einer schnellen Google-Suche habe ich interCharTimeout gefunden, was dasselbe tun soll. Danach änderte das Programm, aber es löste mein Problem nicht. Wenn ich einen Befehl "sen1" auf dem ersten Pi einfüge, sendet das zweite Pi (der Empfänger) keine "Sensordaten" zurück zu ihm. Seltsamerweise, nachdem ich einen Befehl eingegeben habe, wird er keinen zweiten Befehl erhalten. Ich weiß das, weil ich den 2. Pi (Empfänger) frage, um alles auszudrucken, das er einen Befehl vom ersten Pi erhält. – Patattack760

+0

@ Patattack760 Siehe meine Bearbeitung – TisteAndii

Verwandte Themen