2016-03-23 23 views
1

için birden fazla dizeyi birleştirir. Üzerinde bazı sensörler bulunan bir Arduino kullanıyorum. Sensör verilerini bir Xbee pro S1 olan Xbee ile bir uzak PC'ye gönderiyorum. Xbee modülü 38400 baud hızında çalışır. Kablosuz üzerinden göndermek için toplam 15 sensör verisi ve iki zaman bilgim var. Algılayıcılar hareket halindeki bir platform üzerine yerleştirildiklerinden dolayı, veri paketleri kaybolur ve bu nedenle, alıcı bilgisine ait zaman bilgisi içeren tam sensör veri seti alınamaz., Arduino + Xbee

Ben Bu benim dizeleri biçimi (statik karakter dtostrfbuffer [15];) onları çevirdim bu

URT*364.00*348.00*432.00*350.00*427.00*357.00*0.22*0.18*0.81*1.00*0.73*-0.37* 0.15*-0.06*-0.19*6.00*17324.00 
URT*364.00*348.00*432.00*349.00*428.00*357.00*0.22*0.18*0.81*1.00*0.73*-0.24* 0.16*-0.06*-0.19*8.00*2976.00 
URT*361.00*345.00*428.00*345.00*424.00*353.00*0.22*0.18*0.81*1.00*0.73*-0.24* 0.16*-0.06*-0.19*9.00*53812.00 
URT*363.00*347.00*430.00*349.00*427.00*356.00*0.23*0.18*0.81*1.00*0.61*-0.12* 0.15*-0.05*-0.19*11.00*39380.00 

benziyor Aşağıdaki kod şablon

Serial.write('U'); Serial.write('R'); Serial.write('T'); 
      Uint1.ival=rawX_ADXL337; 
      dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
      Serial.write("*"); 
      Serial.write(dtostrfbuffer); 
        Uint1.ival=rawY_ADXL337; 
        dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
        Serial.write("*"); 
        Serial.write(dtostrfbuffer); 
      Uint1.ival=rawZ_ADXL337; 
      dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
      Serial.write("*"); 
      Serial.write(dtostrfbuffer); 
        Uint1.ival=rawX_ADXL377; 
        dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
        Serial.write("*"); 
        Serial.write(dtostrfbuffer); 
      Uint1.ival=rawY_ADXL377; 
      dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
      Serial.write("*"); 
      Serial.write(dtostrfbuffer); 
        Uint1.ival=rawZ_ADXL377; 
        dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
        Serial.write("*"); 
        Serial.write(dtostrfbuffer); 
       //value after multiplication needed to be less than 2^15=32768 
             Uint1.ival=ax; 
             dtostrf(ax,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=ay; 
           dtostrf(ay,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=az; 
             dtostrf(az,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=gx; 
           dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=gy; 
             dtostrf(gy,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=gz; 
           dtostrf(gz,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=mx; 
             dtostrf(mx,5, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=my; 
           dtostrf(my,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=mz; 
             dtostrf(mz,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
           Uint1.ival=wHighNow; 
           dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
           Serial.write("*"); 
           Serial.write(dtostrfbuffer); 
             Uint1.ival=wLowNow; 
             dtostrf(Uint1.ival,4, 2, dtostrfbuffer); 
             Serial.write("*"); 
             Serial.write(dtostrfbuffer); 
             Serial.write("\n"); 
delay(100); 

var ve bunları tek tek gönderme. Aşağıdaki bilgileri kullanarak (ArduinoStringConcat) tüm bilgileri içeren tek bir dize oluşturmaya çalışıyorum, ancak bunu yapamıyorum.

İçerideki tüm sensör verileriyle bir telgraf nasıl oluşturabilir ve Xbee'den gönderebilirim? Lütfen örnekte bazı demo örneği veya kod snippet'i sağlayın.

Xbee pro s1'in bu son büyük telgrafı göndermesi mümkün mü?

Teşekkür

+0

"nedeniyle sensörlerim dönme sırasında, hareketli platform üzerine yerleştirilen nedeniyle, veri paketlerinin kaybolur", donanım nedeniyle oluştuğunu - Bir çarpma sensörü ile ima ettiğiniz gibi veri kaybı arasında gerekli nedensellik yoktur. – Olaf

+0

Karışıklık için üzgünüm.Sensörler yüksek hızda döndürüldüğünde, tüm paketleri (tüm sensör verilerini) alamıyorum. Bu nedenle, bazı paketlerin meydana geldiği veya antenin bazı açılarda çalışmadığı varsayılır. –

+0

Yine de, bunun değiştirilemeyeceği anlamına gelmez (metnin ima ettiği şey budur). Neyse ne sorduğun belli değil. Bu soruyu sormak için en iyi yer olmayabilir. Belki elektronik için SSS'yi kontrol ediyorsun? – Olaf

cevap

0

Bu dizeleri bitiştirmek ve tüm telgraf göndermek için iyi bir fikir değildir.

Aynı şeyi yaptığınız gibi gönderin, ancak alıcı tarafında, paketlenmiş paketinizle karşılaştırarak (zaman diliminde bulunduğunuz gibi) bir zaman fonksiyonu kullanarak paketlerin olup olmadığını kontrol edin. Gönderdiğiniz veya göndermediğiniz tüm sensör verilerini içeriyorsa, paket uzunluğunu da kontrol etmelisiniz.

mümkündür {toplam uzunluğu

kullanarak zamandan comaprision

// kullanılarak //}

idn = fscanf(DUT_port,'%s'); 
L = length(idn); 

A = sscanf(idn,'%*c%f%*c%f%*c%f%*c%f%*c%f',[1 inf]); 

checkpacketloss XBee için tam telgraf ama gereksiz göndermek için! Her iki antenler de düzlemde odaklı değil gibi bence

, packetloss

0

tek tampon içine tüm verileri koyup Serial.write() ile göndermek için gerek yoktur. Fonksiyona çok sayıda çağrı yapılması iyidir ve XBee modülünün paket ayarları, verilerin hava üzerinden ne zaman gönderileceğini belirleyecektir. API modunu kullanmıyorsanız, verilerinizi belirli bir şekilde gruplandıran XBee'ye güvenmemelisiniz. Bunu, uzaktaki bir cihaza akış olarak göndermeyi düşünün. Verileri bir veya daha fazla parçada alabilirsiniz ve bundan yararlanmak için uzak uçta bir araya getirmeniz gerekir.

Ve siz tamsayılar biçimlendirmek için Serial.print() kullanabilir ve yüzer edebilirsiniz:

Serial.print("URT*"); 
Serial.print(rawX_ADXL337); 
Serial.print('*'); 
Serial.print(rawY_ADXL337); 
Serial.print('*'); 
Serial.print(rawZ_ADXL337); 
Serial.print('*'); 
Serial.print(rawX_ADXL377); 
Serial.print('*'); 
Serial.print(rawY_ADXL377); 
Serial.print('*'); 
Serial.print(rawZ_ADXL377); 
Serial.print('*'); 
Serial.print(ax); 
Serial.print('*'); 
Serial.print(ay); 
Serial.print('*'); 
Serial.print(az); 
Serial.print('*'); 
Serial.print(gx); 
Serial.print('*'); 
Serial.print(gy); 
Serial.print('*'); 
Serial.print(gz); 
Serial.print('*'); 
Serial.print(mx); 
Serial.print('*'); 
Serial.print(my); 
Serial.print('*'); 
Serial.print(mz); 
Serial.print('*'); 
Serial.print(wHighNow); 
Serial.print('*'); 
Serial.print(wLowNow); 
Serial.print('\n'); 
+0

Bu yöntem aynı zamanda kayan noktaların doğrudan örneğin 3999.99 gönderilmesini de sağlar. Bu sebepten dolayı bir dize olarak gönderiyordum ve alıcı tarafında, onu geri dönüp kayan nokta sayısına dönüştürüyorum, –

+0

Deneyin ve bulun. Serial.print() biçimleri yüzer. – tomlogic