2017-05-16 4 views
1

Ich sende Daten über eine serielle Schnittstelle mit der WriteFile-Funktion des Fensters. Dies wird von einem Raspberry Pi-Zero empfangen, das ein Python-Skript ausführt, das in einer pyserialen Readline-Schleife sitzt (Code unten). Auf Windows-Seite lege ich den Inhalt einer Datei in einen Puffer und rufe dann die WriteFile-Funktion auf. Es funktioniert gut für etwa die ersten 95-99% der Daten, wie in, der Raspberry Pi erhält diese Daten gut. Ich übertrage einen Dateiinhalt, der ungefähr 200 KB groß ist, so dass er eine Menge guter Daten erhält, aber nicht die Daten am Ende. Immer wenn ich eine kleinere Menge von Daten, wie nur eine Zeile, sende, ist der größte Teil der Zeile fehlerhaft.Windows zu Raspberry Pi Zero Serial Issues

Windows Code (die entsprechenden Bits):

config.StopBits = ONESTOPBIT; 
config.BaudRate = 115200; 
config.Parity = NOPARITY; 
config.fBinary = TRUE; 
config.fParity = TRUE; 
config.ByteSize = 8; 

//10 second time out 
COMMTIMEOUTS timeOuts; 
timeOuts.ReadIntervalTimeout = 10000; 
timeOuts.ReadTotalTimeoutConstant = 10000; 
timeOuts.ReadTotalTimeoutMultiplier = 10000; 
timeOuts.WriteTotalTimeoutConstant = 10000; 
timeOuts.WriteTotalTimeoutMultiplier = 10000; 

char* packet_buffer; 

if (!WriteFile(dataFile, packet_buffer, size, &bytesRead, NULL)) 
{ 
    _tprintf("There is a problem: %d\n", GetLastError()); 
} 

Raspberry Pi Python Script (relevante Bits):

ser = serial.Serial(
     port = '/dev/serial0', 
     baudrate = 115200, 
     parity = serial.PARITY_NONE, 
     stopbits = serial.STOPBITS_ONE, 
     bytesize = serial.EIGHTBITS, 
     timeout = 10 
) 

data = open("data.txt", "w") 

while 1: 
    x = ser.readline() 
    data.write(x) 

Sorry, wenn diese Frage vage ist, aber ich habe mit diesem wurde das Hantieren für ein paar Tage jetzt. Mein "Bauchgefühl" ist, dass das mit der Raspberry Pi Zero Hardware nicht stimmt (wie es einfach nicht schnell genug ist oder sowas), aber das macht nicht gerade Sinn, wenn es ein paar hundert KB gut ankommt.

+0

Versuchen Sie Ihre Baudrate senken, oder irgendeine Art von Flusssteuerung ermöglichen. Wirklich, Sie sollten die Flusskontrolle in beide Richtungen verwenden. Es ist in der [DCB-Struktur] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363214 (v = vs.85) .aspx). –

+0

Ja die Baudrate auf z.B. 19200 sehen Sie, ob es besser wird, was wahrscheinlich anzeigen würde, dass eine Flusskontrolle benötigt wird. – barny

Antwort

0

Danke für die Antworten Jungs, aber ich schaffte es, es herauszufinden.

Endlich brach ich den Logikanalysator aus und sah, dass der Pi alles erhielt, was übertragen wurde, es wurde einfach nicht alles im Puffer über das serielle Kabel übertragen.

Stellt sich heraus, dass das serielle Kabel, das ich/bin, Scheiße ist. Ich habe versucht, einen anderen zu verwenden und es hat erfolgreich alle Daten übertragen.

Hier ist das schlechte Kabel (kam mit dem pi Null-Starter-Kit oder etwas): https://www.adafruit.com/product/954?gclid=CIaF2_CX_NMCFU02gQodotIDmA

Das Kabel, das tatsächlich funktioniert: http://www.gearmo.com/shop/usb-to-3-3v-ttl-pin-header-cable-gm-ttl3vt/

0

Versuchen Sie, die Flusskontrolle zu aktivieren.

Auf der Seite Python, setzten rtscts=1 in Ihrem Ctor:

ser = serial.Serial(
     port = '/dev/serial0', 
     baudrate = 115200, 
     parity = serial.PARITY_NONE, 
     stopbits = serial.STOPBITS_ONE, 
     bytesize = serial.EIGHTBITS, 
     timeout = 10, 
     rtscts = True 
) 

Auf dem Sieg C++ Seite, Hardware-Flusssteuerung in den DCB Struct aktiviert:

DCB dcb; 
SecureZeroMemory(&dcb, sizeof(DCB)); 
dcb.DCBlength = sizeof(DCB); 
fSuccess = GetCommState(dataFile, &dcb) 
dcb.fOutX = false; 
dcb.fInX = false; 
dcb.fOutxCtsFlow = true; 
dcb.fOutxDsrFlow = true; 
dcb.fDsrSensitivity = true; 
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; 
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; 
fSuccess = SetCommState(hCom, &dcb);