2016-04-13 28 views
0

. Alınan şamandıra değerlerini yazdırırken seri monitörde sadece ilk iki rakamı görebilirim.başka bir Arduino float değerleri gönderemez: Ben başka bir Arduino üç float değerleri göndermek ve almak Arduino bir dizide bu float değerleri saklamak istediğiniz bir proje yapıyorum

ben acemiyim ve bütün kayan noktalı değerler nasıl bilmiyorum. Lütfen program ile bana yardımcı olun. Burada verici ve alıcı kodunu yayınladım. Verici Kod: önceden

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 

teşekkürler.

cevap

0

İlk iki basamak göremiyoruz; Tamsayı kısmını görüyorsunuz. Çünkü Serial.Write tamsayı değerlerini kabul eder, bu nedenle yüzdeleriniz int (yani kesilmiş) olarak dönüştürülür ve gönderilir. Eğer "oldukları gibi", önce bir bayt dizisi değerleri dizisi yayın yapabiliyorsa onları geçmek istiyorsanız

, o zaman 'ham' göndermek; alırken sadece tüm baytları almak zorundasınız ve .. işiniz bitti. İşte kod:

Gönderenin kodu:

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() 
{ 
} 

Alıcının Kodu:

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]); 
    } 
} 

Not 1: Bu test etmedim, bu yüzden hatalar .. eğer deneyin ve orada olabilir biz

Not 2 tekrar bakacağız, çalışmaz: Bu çalışması gerekir, ancak başlangıç ​​algılamak için bir yol var ve yok çünkü siz "gerçek hayatta" sorunların çoğunu olacak şanzımandaki durak noktaları n. Sağlam bir iletişim için, bayttan kaçış veya bir bit borcunu elden geçirme gibi bir şey eklemeyi düşünebilirsiniz.

Not 3: Bu, yalnızca aynı boyuttaki float ve aynı endensiteye sahip sistemlerde (örneğin iki arduino arasında) çalışır. Diğer sistemlerde (örneğin bir PC veya mobil ya bilir) Eğer endian veya şamandıra uzunluğu uyuşmazlığı ben iş için

+0

Teşekkür kullanılan otomatik döküm kullanarak iletişim imkansız hale beri açık bir şekilde, bir numara dönüştürmek için İHTİYACINIZ olacak arabirim vasıtasıyla bağlantı kurarken .. Ancak, hem gönderme hem de alma işleminde hata alıyorum. İletim programında, hatayı "Donanım seri :: yazma (float [3], imzasız int") için eşleştirme fonksiyonu yok. – Krish

+0

Alıcının programında hatayı "başlatılamıyor", "uint8_t *" değerini başlangıçta "değiştiremez" olarak aldım. – Krish

+0

@Krish Ok, belki de dolaylı yayınlamayı sevmez. (Ben kodu düzeltilmiş beri cevaba bakınız, siz iki satır değiştirmek zorunda - göndericinin bir tane ve alıcı bir tane) explicitely 'uint8_t *' işaret eden döküm deneyin Bu kod bana yardımcı olabilir – frarugi87