将多个字符串连接到一个Arduino + Xbee

时间:2016-03-23 23:23:24

标签: string arduino microcontroller zigbee

我有一个带有传感器的Arduino。我将传感器数据发送到一台带Xbee的远程PC,这是一台Xbee pro S1。 Xbee模块的波特率为38400。我有15个传感器数据和两个时间信息通过无线发送。由于我的传感器放置在移动平台上的事实,在旋转期间,数据包丢失,因此,在接收器侧不能接收具有时间信息的完整传感器数据集。

我有以下代码模板

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

这看起来像这样

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

我已将它们转换为字符串格式(static char dtostrfbuffer [15];)并单独发送它们。我正在尝试使用以下引用(ArduinoStringConcat)形成包含所有信息的单个字符串,但我无法执行此操作。

如何与内部所有传感器数据形成一份电报并通过Xbee发送?请在我的示例中提供一些演示示例或任何代码段。

Xbee pro s1发送这个最终的大电报是否可行?

由于

2 个答案:

答案 0 :(得分:0)

无需将所有数据放入单个缓冲区并使用Serial.write()发送。对该功能进行多次调用很好,XBee模块的分组设置将决定何时通过无线方式发送数据。除非您使用API​​模式,否则您不应该依赖XBee以任何特定方式对数据进行分组 - 将其视为以流形式发送到远程设备。您可能会收到一个或多个数据块中的数据,并且您需要在远程端将它们拼接在一起才能使用它。

您可以使用Serial.print()格式化整数和浮点数:

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');

答案 1 :(得分:0)

连接字符串并发送整个电报不是一个好主意。

发送与您正在进行的操作相同但在接收方使用时间函数检查packetlos,与您收到的数据包进行比较(因为您已经有时间信息)。如果包长度包含您要发送的所有传感器数据,则还应检查包长度。

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

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

checkpacketloss { //使用时间comaprision

//使用总长度

}

Xbee可以发送完整的电报但不必要!

我认为,由于硬件导致数据包丢失,因为两个天线在平面上的定向不正确