将多个字符串连接成一个用于 Arduino+Xbee
concatenate multiple strings to one for Arduino+Xbee
我有一个带有一些传感器的 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发出最后的大电报可行吗?
谢谢
无需将所有数据放入单个缓冲区并使用 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');
连接字符串并发送整个电报不是一个好主意。
发送与您正在做的相同的事情,但在接收方使用时间函数检查 packetlos,与您收到的数据包进行比较(因为您已经有时间信息在里面)。您还应该检查 packetlength,它是否包含您发送的所有传感器数据。
idn = fscanf(DUT_port,'%s');
L = length(idn);
A = sscanf(idn,'%*c%f%*c%f%*c%f%*c%f%*c%f',[1 inf]);
检查数据包丢失{
//使用时间比较
//使用总长度
}
Xbee 可以发送完整的电报,但没有必要!
我认为,丢包是由于硬件造成的,因为两个天线在平面上的方向都不好
我有一个带有一些传感器的 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发出最后的大电报可行吗?
谢谢
无需将所有数据放入单个缓冲区并使用 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');
连接字符串并发送整个电报不是一个好主意。
发送与您正在做的相同的事情,但在接收方使用时间函数检查 packetlos,与您收到的数据包进行比较(因为您已经有时间信息在里面)。您还应该检查 packetlength,它是否包含您发送的所有传感器数据。
idn = fscanf(DUT_port,'%s');
L = length(idn);
A = sscanf(idn,'%*c%f%*c%f%*c%f%*c%f%*c%f',[1 inf]);
检查数据包丢失{ //使用时间比较
//使用总长度
}
Xbee 可以发送完整的电报,但没有必要!
我认为,丢包是由于硬件造成的,因为两个天线在平面上的方向都不好