2012-04-13 38 views
4

我無法穿過一個簡單的2節點的Xbee網絡發送一個浮子。發射浮點值跨越的Xbee網絡

我意識到的XBee系統通過字節傳送包,這樣我就可以送一個char,但我無法發送比什麼都重要,我似乎無法找到任何地方的任何文件。

這是我當前(基本)代碼。

發件人:

(... appropriate setup...) 
void loop() 
{ 
    sensorValue = analogRead(analogInPin); 
    sensorValueTemp = sensorValue/9.31; //LM35 measurement into Centigrade 
    Serial.print(sensorValueTemp); 
    delay(1000); 
} 

接收機:

(...appropriate setup...) 
void loop() { 
    lcd.setCursor(0, 0); 
    if (Serial.available() > 0) { 
    lcd.print(incomingByte); 
    } 
    delay(1000); 
} 

任何提示,獲得浮子成功傳送將是巨大的?或者如果它已被正確傳輸,如何正確讀取?

感謝

回答

3

您可以以字節爲單位發送float,並在接收重建float

下面的例子可以幫助你:

發送方:

float x = 1128.476; 

char b[sizeof(x)]; 
memcpy(b, &x, sizeof(x)); 

// Iterate over b and send bytes 
// [...] 

接收側:

float y = 0; 

char b[sizeof(x)]; 

// Store 4 bytes representing the float into b 
// [...] 

// Rebuild the float 
memcpy(&y, b, sizeof(y)); 

最後,你有float y在接收端,它具有發件人側的float x的相同表示。

+0

請簡化一下 - 至少使用一個字節數組而不是四個單獨的字節。 'char b [sizeof x]; memcpy(b,&x,sizeof b);' – tomlogic 2012-04-15 05:24:09

+0

@tomlogic添加了簡化的方法:) – 2012-04-15 09:26:57

+0

沒有理由做所有的memcpy()foo。如果你想要一個字節指向浮點數,((char *)&y)工作得很好。如果你討厭這個醜陋的話,「char * b =((char *)&y);」可能會讓你感覺更好。 – 2012-04-15 10:05:44

0

通過簡單地在「發送」端獲取一個字節大小的指針(char *),您可以在相同體系結構,內存佈局,字節序列等兩臺機器之間發送所需的所有二進制數據,並遍歷引用該對象中的字節數的對象。在「接收」方面,您分配一個大小相同的對象(float,long,struct foo),並逐個接收字節,並將其轉換爲字節大小的指針,該指針在接收到每個字節後遞增。

在發送端 -

void sendObject(const void *object, size_t size) { 
    char *outputCursor = (char *) object; 

    for (;size > 0;size--) 
    yourSendAByteFunction(*outputCursor++); 
} 

在接收端,假設yourReceiveAByteFunction()返回0..255一個有效字節和-1「接收錯誤」,你可以做到這一點 - -

int receiveObject(void *object, size_t size) { 
    char *inputCursor = (char *) object; 

    for (;size > 0;size--) { 
    int nextByte = yourReceiveAByteFunction(); 
    if (nextByte < 0) 
     return FALSE; 

    *inputCursor++ = nextByte; 
    } 
    return TRUE; 
} 

可以通過聲明yourSendAByteFunction()做同樣的I/O錯誤在sendObject()功能檢查,以便它返回取決於在輸出是否發生錯誤TRUEFALSE。這一切都取決於您可以承受多大的複雜性,以及您是否擁有可靠的傳輸鏈路。

如果你有不能通過「移位」字節和以「移位」字節爲前綴表示某個其他字節的字節值組來傳送字節,你也可以做一些數據封裝。

0

您的原始發件人發送表示浮點值的ASCII字符串。如下圖所示

爲了接收和顯示你需要修改行的值:

(...appropriate setup...) 
void loop() { 
    lcd.setCursor(0, 0); 
    while (Serial.available() > 0) {  //Changed Line 
     incomingByte = Serial.read();  //Added Line 
     lcd.print(incomingByte); 
    } 
    delay(1000); 
} 

注意:如果將更好地終止與CR串行輸出的設備,而不是同步的延遲(1000);