2017-03-24 37 views
0

我對python很陌生,所以我得到了幾個問題。 我有一個與SD卡接口存儲二進制文件與一些數據的arduino。我們稱之爲SAFEFILE.BIN。 我想要做的主要事情是,通過串口發送數據,並在我的電腦上用python程序創建1:1副本,以便進一步操作。在python中保存串行輸入1:1

這裏是我使用的到Arduino的串行輸出寫入一個文件(串行端口是開放的,併發送數據)的部分:

f = open('SAFEFILE.BIN, 'w+') 
while aux != b'': 
     aux = ser.readline() 
     f.write(aux) 
else: 
     print('Copy of SAFEFILE.BIN succesfully created') 
     f.close() 

Arduino的代碼只是:

File dataFile = SD.open(datafile); 
if (dataFile) { 
    while (dataFile.available()) { 
    Serial.write(dataFile.read());} 

一切工作到目前爲止。該文件正在充滿我的數據。但仔細看後,我提到了一些問題。我用十六進制編輯器讀取十六進制信息進行比較的兩個文件(原上的Arduino和它的副本)

Original file

Saved file

正如你所看到的write()或閱讀過程似乎將「0A」解釋爲換行並在其前面添加了一個回車「0D」。在我的情況下,0A只是意味着10. 有沒有辦法阻止python添加一些我不需要的字節?我所要做的就是保存每個字節的串行輸入字節,而無需任何解釋或編輯。

我試着用各種格式對讀取操作進行解碼和編碼,至今沒有運氣。

因爲我需要這個safefile是完全正確的下一步驟,給了我兩個選擇:

  1. 試圖讓saveprocess在SAVEFILE爲「0D 0A」的bytecombination右
  2. 搜索和用0A代替它

我肯定會更喜歡選項1!有沒有人可以幫我在這裏?

回答

0

在arduino中,您發送的信息是Serial.write(),它只是發送數據包,沒有行結束。然後你用蟒蛇serial.readline()閱讀,它接受一個輸入流並查找一行結尾並將它分開。如果你不想要任何行結尾和只是原始數據,使用Python的serial.read(bytes),當你不給一個字節數時,它會以非阻塞模式連續讀取。在蟒蛇串行這裏文檔:https://pythonhosted.org/pyserial/shortintro.html#readline 所以,你的代碼可能是這樣的:

f = open('SAFEFILE.BIN, 'wb') 
while aux != b'': 
    aux = ser.read() 
     f.write(bytearray(aux)) 
else: 
    print('Copy of SAFEFILE.BIN succesfully created') 
    f.close() 
+0

謝謝您的回答!可悲的是,即使我使用read()而不是readline(),問題仍然存在。所以它似乎是導致這個問題的write()過程。 – hoffma0901

+0

好的嘗試'f.write(bytearray(aux))'應該傳遞一個字節對象來寫。 –

+0

仍有相同的輸出與額外的0D ... – hoffma0901

相關問題