2016-04-13 8 views
0

Ich mache ein Projekt, in dem ich drei Float-Werte von einem Arduino zum anderen senden und diese Float-Werte in einem Array im empfangenden Arduino speichern soll. Während des Druckens der empfangenen Float-Werte kann ich nur die ersten zwei Ziffern im seriellen Monitor sehen.Float-Werte können nicht von einem Arduino zu einem anderen gesendet werden:

Ich bin ein Anfänger und weiß nicht, wie man die ganzen Float-Werte bekommt. Bitte helfen Sie mir mit dem Programm. Hier habe ich den Sender- und Empfängercode gepostet. Mittlers Code:

float transmit[3]={72.453444,83.345678,60}; //Values to be sent 

void setup() 
{ 
Serial.begin(115200); 
int i; 
for(i=0;i<3;i++) 
{ 
Serial.write(transmit[i]); 
} 
} 
void loop() 
{ 
} 

Receiver’s Code: 
float received[3];  //create an float array 
int i; 
void setup() 
{ 
    Serial.begin(115200); 
} 
void loop() 
{ 
while(Serial.available()>0) 
{ 
    for(i=0;i<=2;i++) 
    { 
    received[i]=(Serial.read()); 
    delay(10); 
    } 
    Serial.println(received[0]); 
    Serial.println(received[1]); 
    Serial.println(received[2]); 
} 
} 
Values received on Serial Monitor: 
72 
83 
60 

Vielen Dank im Voraus.

Antwort

0

Die ersten beiden Ziffern werden nicht angezeigt. Sie sehen den ganzzahligen Teil davon. Dies liegt daran, dass Serial.Write ganzzahlige Werte akzeptiert, also werden Ihre Gleitkommazahlen in int konvertiert (d. H. Abgeschnitten) und dann gesendet.

Wenn Sie sie "so wie sie sind" übergeben möchten, können Sie zuerst das Array der Werte in ein Bytearray umwandeln und dann "rohe" senden; wenn Sie empfangen, müssen Sie nur alle Bytes erhalten und .. Sie sind fertig. Hier ist der Code:

Sender Code:

float transmit[3]={72.453444,83.345678,60}; //Values to be sent 

void setup() 
{ 
    Serial.begin(115200); 
    Serial.write((uint8_t*)transmit, 3 * sizeof(float)); 
} 
void loop() 
{ 
} 

Empfängers Code:

float received[3];  //create an float array 
int i; 
void setup() 
{ 
    Serial.begin(115200); 
} 
void loop() 
{ 
    if (Serial.available() >= 3 * sizeof(float)); 
    { 
     uint8_t *recv_bytes = (uint8_t*)transmit; 
     for(i=0; i < 3 * sizeof(float); i++) 
     { 
      recv_bytes[i] = Serial.read(); 
     } 
     Serial.println(received[0]); 
     Serial.println(received[1]); 
     Serial.println(received[2]); 
    } 
} 

Anmerkung 1: Ich habe nicht getestet, so könnte es zu Fehlern .. Versuchen Sie, und wenn es funktioniert nicht, wir werden es wieder betrachten

Hinweis 2: Dies sollte funktionieren, aber Sie werden eine Menge Probleme im "wirklichen Leben" haben, weil Sie keine Möglichkeit haben, den Start und zu erkennen Haltepunkte im Transmissio n-. Für eine robuste Kommunikation, in Betracht ziehen, etwas wie Byte Escaping oder Reservieren eines Bit-Bor-Handshaking

Hinweis 3: Dies funktioniert nur auf Systemen mit der gleichen Größe von Float und gleicher Endianess (z. B. zwischen zwei Arduinos). Bei Schnittstellen mit anderen Systemen (zB einem PC oder einem Mobiltelefon oder wer weiß) müssen Sie eine Nummer explizit umwandeln, da die Endianness oder Float Length Mismatch die Kommunikation unmöglich macht.

+0

Vielen Dank für Ihre Arbeit. aber immer noch Fehler sowohl im Senden als auch Empfangen Programm .. In Sende-Programm habe ich den Fehler als "keine übereinstimmende Funktion für den Aufruf an 'Hardware serial :: write (float [3], unsigned int)'". – Krish

+0

Im Empfänger-Programm habe ich den Fehler als "kann nicht konvertieren Float zu 'uint8_t *' in der Initialisierung". – Krish

+0

@Krisch Ok, vielleicht mag es nicht implizite Besetzung. Versuchen Sie, die Zeiger explizit auf 'uint8_t *' zu setzen (siehe die Antwort seit ich den Code korrigiert habe; Sie müssen zwei Zeilen ändern - eine im Absender und eine im Empfänger) – frarugi87

Verwandte Themen