2017-05-16 111 views
1

我在使用窗口的WriteFile函數串口發送數據。這是由一個覆盆子pi零接收運行python腳本坐在pyserial readline循環(代碼如下)。在Windows端,我將文件的內容放入緩衝區,然後調用WriteFile函數。對於大約第一個95-99%的數據來說,它的效果非常好,因爲覆盆子pi會收到這些數據。我發送的文件內容大小大約爲200 KB,因此它獲得了大量的好數據,但最終數據卻沒有。每當我發送較少量的數據,如只是一條線,那麼大部分線都被破壞了。Windows以樹莓派零若干問題

Windows代碼(相關位):

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()); 
} 

樹莓派的Python腳本(相關位):

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) 

很抱歉,如果這個問題是模糊的,但我一直是這樣的擺弄現在幾天。我的「直覺」是,這是什麼毛病的樹莓派零硬件(像它只是不夠快或東西),但是,當它接收到幾百KB就好並不完全意義。

+0

試着降低波特率,或使某種流量控制。真的,你應該使用流量控制。它是在[DCB結構](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363214(V = vs.85)的.aspx)。 –

+0

是將波特率降低至例如19200看它是否變得更好,這可能表明需要流量控制。 – barny

回答

0

感謝您的答案球員,但我設法弄清楚。

我終於爆發了邏輯分析儀,只見那丕正在接受,目前正在傳播的一切,它只是在緩衝區不是一切都正在通過串行電纜發送。

原來串行電纜我/我用的就是狗屎。我嘗試使用不同的一個,它成功地傳輸了所有的數據。

這裏是壞的電纜(附帶丕零入門套件或東西):https://www.adafruit.com/product/954?gclid=CIaF2_CX_NMCFU02gQodotIDmA

實際工作的電纜:http://www.gearmo.com/shop/usb-to-3-3v-ttl-pin-header-cable-gm-ttl3vt/

0

嘗試啓用流量控制。

在Python端,設置rtscts=1在您的構造函數:

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

就贏C++方面,能夠在DCB Struct硬件流控制:

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);