2017-08-02 117 views
1

我想通過Arduino上的Serial.write()一次發送六個整數,並將它們發送給python。到目前爲止,我已經設法將整數轉換爲字節指針(我認爲這是名稱)並通過串行發送它們。但是,當我嘗試在python端重新組裝它們時,我收到了一些我不想看到的奇怪數字。重組從Arduino發送到Python的串行數據

Arduino的代碼:

int myInts[6]= {1455, 1446, 6766, 974, 365, 455}; 

void setup() 
{ 
    Serial.begin(9600); 
} 
void loop() 
{ 

    byte *p = (byte)myInts; 
    for(byte i = 0; i < sizeof(myInts); i++){ 
    Serial.write(p[i]); 
    } 
} 

Python代碼

import argparse 
import numpy 
import time 
import serial 
import struct 

ser = serial.Serial('/dev/ttyACM0', 9600) 
while True: 
    b = ser.read(4) 

    i = struct.unpack('i' ,b) 
    print(i) 

輸出:

(-1090650113,) (285341695) (10683141) (-1090650177,) (285341695,) (10683141,)

謝謝!

Vik

回答

0

我會提供幾種選擇。 最簡單的一個最後列出。

您應該認識到的第一件事是int在兩個平臺上的大小不同。 Arduino int是一個有符號的16位int,-32768-> 32767.你的python int是一個32位int。當然,返回的數字遠遠超出了任何16位數字的範圍。

我建議將您在Arduino中的int更改爲unsigned int,然後將您的python解壓縮格式字符串更改爲H(無符號短)。或者,將Arduino作爲int並將您的python解壓縮格式字符串更改爲'h'(簡寫),然後查看它是否對您有所幫助。哦,當然你應該改爲b = ser.read(2),因爲這些現在都是2字節整數。

接下來,Arduino的Serial.write()方法支持一個字節,一個字符串或一個長度的緩衝區。不是一個字節指針。所以雖然我沒有Arduino在我面前進行測試,但我認爲您應該使用命令的Serial.write(buf,len)形式並擺脫「字節指針」,這是我從未在任何Arduino文檔中提到過的:

Serial.write(myInts, 12); 

最後,最容易做的事情很簡單,就是用Serial.write(str)和整個發送一個字符串。然後在python端簡單地將字符串轉換爲您選擇的整數類型。

+0

非常感謝!這是一個完美的回覆!在過去,我使用arduino中的Serial.println(),但是我在python方面得到了一些奇怪的字符串,例如「/ xff」或「/ xfe」。我也讀過Serial.write()更適合發送數據,這就是我想使用字節的原因,因爲我擔心使用Strings會導致問題,就像使用Serial.print()一樣。你怎麼看? – VikramB

+0

@VikramB我認爲字符串在Arduino上最簡單。如果我覺得我的答案是最好的,我希望你能夠點擊複選標記「接受」我的答案。 – TomServo

+0

我已經嘗試發送一個字符串通過Serial.write通過投我想發送到一個字符串的整數,但我得到:「沒有匹配的函數調用'HardwareSerial ::寫(字符串&)'」 – VikramB

相關問題