2017-11-29 35 views
1

Dieses Problem ist ziemlich kompliziert. Scheinbar habe ich einfache Zwei-Wege-Kommunikation beetwen 2 Geräte, wo Leseseite ist Raspberry Pi 3. Ich versuche, Datei zu übertragen. Ich sende es Teil für Teil (5kb Teil). Es sieht so aus:Keine Bytes mehr vom seriellen Port lesen (Python/RPi/UART)

1) Sendeseite ersten 5KB Teil senden (genau 5136 Bytes in dem ersten 16 Bytes ID/SIZE/ADD_INFO/CRC)

2) RPi3 lesen 5136 Byte und CRC für chunk berechnen.

3) RPi3 CRC vergleichen von Sendeseite und berechnet durch RPi

4a) empfangen Wenn CRC entspricht nicht ich Spuren von RX zu TX-Leitung mit Dual-Bus-Buffer-Tor mit 3-State-Ausgänge und stellen hohe Einschaltströme Zustand bei TX-Leitung (ich behalte es für 30ms).

4b) Wenn CRC Spiel ich für das nächste Stück Datei warten nur

5) zu Seitenschalter Fahrspuren Senden und meine TX Zustand lesen, wenn Zustand HIGH/1 (ist, wenn CRC) nicht übereinstimmt sendet sie gleiche Chunk (Retransmission) wenn State LOW/0 ist, wird ein weiterer Chunk gesendet. (Änderungszustand nehmen 10 ms)

Auf osciloscope sieht das so aus (4a):

4a

und dieser (4b):

4b

Beetwen 5136 chunk besteht Freie Zeit, um CRC zu berechnen, dann haben wir auf RPi3 Seite wechselnden Zustand, wenn wir müssen, weil CRC nicht übereinstimmt (rote Linien bei 4a) und lesen TX Seite von Sende-Seite.

Ok jetzt einige vereinfachte Code aus RPi:

def recv(): 
    while True: 
     #Set line to low because I want to read data 
     GPIO.output(16, GPIO.LOW) 
     ID = ser.read(4) 
     SIZE = ser.read(4) 
     ADD_INFO = ser.read(4) 
     CRC = ser.read(4) 
     #get crc from sending side 
     crc_chunk = int.from_bytes(CRC, byteorder='little') 
     data = ser.read(5120) 
     #calculating CRC from chunk 
     rpiCRC = crcSTM(data) 

     while True: 
      <--- here I wait about 20ms to calculate CRC 
      if rpiCRC != crc_chunk: 
       #Crc doesn't match I want retransmission 
       GPIO.output(16, GPIO.HIGH) 
       <--- keep it HIGH for about 30ms 
       break 

      else: 
       #keep it low because crc match and we are waiting for next chunk 
       GPIO.output(16, GPIO.HIGH) 
       break 

Das alles echt aussieht, aber auf den Punkt. Ich bekomme immer nur den ersten Brocken nach diesem RPi halt einfach das Lesen von Bytes. Es passiert nur im Fall '4b', ich bekomme den ersten Chunk richtig und ich warte auf den nächsten und dann höre RPi einfach auf Bytes zu lesen oder gebe mir von Zeit zu Zeit nur ein paar Kratzer. Ich teste was, wenn ich den ersten Brocken richtig bekomme und eine Retransmissions-Sache setze, aber alles sieht gut aus und ich bekam die ganze Zeit eine erneute Übertragung des ersten Stücks und bekomme es die ganze Zeit. Ich kam dazu, dass die Änderung der Leitung auf der Sendeseite, wenn ich LOW/1-Status habe, auf RPi wirkt und es einfach aufhört, Bytes richtig zu lesen. Ich weiß nicht, warum es es vermasselt und ich weiß nicht, wie ich es bekämpfen soll. Ich habe versucht, den Puffer zu spülen, den Port zu schließen, bevor ich die Side-Chasing-Zeile sende und es öffne, nachdem es die Zeile wieder gewechselt hat, aber das alles tut nichts, was kann ich mehr tun?

P.S Dieses Warten Dinge, die ich in meinem eigenen Timer tun, aber es gibt keine Notwendigkeit, hier Code wie Code von Sendeseite, da Problem auf RPi Seite ist. P. S Entschuldigung für chaotische Sprache, aber ich versuchte es erklären so einfach wie ich kann

Antwort

1

Ok, ich kämpfe es. Ich habe die Option "Soll eine Login-Shell über die serielle Schnittstelle erreichbar sein" in sudo raspi-congif aktiviert. Ich weiß nicht, warum das alles vermasselt hat, aber das alles zu beheben. Das ist ziemlich merkwürdig, weil ich irgendwann mit Himbeere und Serien spiele und es gab kein Problem, wenn RPi3 etwas per UART oder einfach nur lesen würde, ohne die Zeilen zu ändern etc :)

Verwandte Themen