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):
und dieser (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