2012-09-23 62 views
0

我試圖將浮點數據從arduino發送到python。數據以8個連續字節的數據(雙倍大小),然後換行符('\ n')發送。如何收集這些連續字節並將其轉換爲適當的格式在蟒蛇結束(系統端)從arduino收集'double'類型的數據

void USART_transmitdouble(double* d) 
{ 
    union Sharedblock 
    { 
     char part[sizeof(double)]; 
     double data; 

    }my_block; 
    my_block.data = *d; 
    for(int i=0;i<sizeof(double);++i) 
    { 
     USART_send(my_block.part[i]); 
    } 

    USART_send('\n'); 
} 

int main() 
{ 
    USART_init(); 
    double dble=5.5; 
    while(1) 
    { 
     USART_transmitdouble(&dble); 
    } 
    return 0; 
} 

蟒蛇code.Sure這不會打印正確的格式的數據,但只是想表明我曾嘗試。

import serial,time 

my_port = serial.Serial('/dev/tty.usbmodemfa131',19200) 
while 1: 
    print my_port.readline(), 
    time.sleep(0.15) 

更新

my_ser = serial.Serial('/dev/tty.usbmodemfa131',19200) 

while 1: 
    #a = raw_input('enter a value:') 
    #my_ser.write(a) 
    data = my_ser.read(5) 
    f_data, = struct.unpack('<fx',data) 
    print f_data 
    #time.sleep(0.5) 

使用struct模塊如圖上面的代碼能夠打印的浮點值。但是,如果我弄亂了time.sleep()或者停止傳輸並重新啓動它,打印出的錯誤值就會被打印出來。我猜錯誤的一組4字節正在解壓在這種情況下。關於我們可以在這裏做什麼的任何想法?

+1

您一定會想要使用['struct'](http://docs.python.org/library/struct.html)模塊,但我不確定在漂浮時使用它是個好主意點數。也許你應該使用整數,或者使用你自己的二進制格式。另外,請記住,您以原始二進制表示形式發送該號碼,因此它肯定可以包含換行符的ASCII碼。你應該使用'read'而不是'readline'(並且忘記換行符,你不需要它) –

+2

'struct.unpack'被仔細地寫入來正確解開通過線路接收到的IEEE 754浮點數,不管它們是怎麼樣的在運行Python的機器上表現出來。但它仍然希望接收指定格式的數據,發送方應確保發送數據。在你的問題提示下,我看了一下arduino的網站,並且很驚訝[學習](http://arduino.cc/en/Reference/Double),Arduino'double'實際上是單寬度精度數字,意思是' struct'必須是'f'格式,而不是'd'。我會更新答案。 – user4815162342

回答

2

在Arduino上,doublethe same as float,即佔用4字節存儲器的小尾數single-precision floating-point number。這意味着你應該閱讀整整5個字節,使用f格式的小端的變體將它解開,而忽略與x其後的換行符:

import struct 
... 

data = my_port.read(5) 
num, = struct.unpack('<fx', data) 

請注意,你不希望使用readline因爲浮點數的表示的任何字節可以是'\n'。正如Nikklas B.指出的那樣,你根本不需要費心使用新行,只需發送4個字節並從Python中讀取儘可能多的字節即可。在這種情況下,格式字符串將是'<f'

+0

儘管我使用的是arduino,但我並沒有使用它的任何libraries.My大學不希望我使用arduino libraries.I'm使用它作爲一個簡單的atmega328p開發板。我要去嘗試這個開箱現在並回報。 – tez

+0

我嘗試了兩種方式。工作很棒。我停止從arduino結束髮送換行符,並使用' tez

+1

嘗試創建一個'struct.Struct(' user4815162342