【问题标题】:concatenate multiple strings to one for Arduino+Xbee为 Arduino+Xbee 将多个字符串连接为一个
【发布时间】:2016-03-23 23:23:23
【问题描述】:

我有一个带有一些传感器的 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 发送?请在我的示例中提供一些演示示例或任何代码 sn-p。

Xbee pro s1 发送这个最后的大电报可行吗?

谢谢

【问题讨论】:

  • “由于我的传感器放置在移动平台上,因此在旋转过程中,数据包会丢失” - 正如您所暗示的那样,移动传感器和数据丢失之间没有必然的因果关系。跨度>
  • 很抱歉让您感到困惑。我发现当传感器高速旋转时,我没有得到所有的数据包(所有的传感器数据)。因此,我假设发生了一些数据包丢失,或者可能是天线在某些旋转角度无法正常工作。
  • 它仍然不意味着这不能改变(这就是你的文字所暗示的)。无论如何,不​​清楚你在问什么。我怀疑这可能不是提出此类问题的最佳场所。也许您检查了电子产品的常见问题解答?
  • 我在问如何将所有传感器数据(字符串)连接到一个字符串?我已经在我的问题中写了这个!
  • “我做不到”是什么意思?有什么错误/问题?无论如何,我对字符串有问题;我总是尝试使用固定大小。声明一个char sendBuffer[BUFFLEN];,并将BUFFLEN 设置为足够大的值。你最长的字符串或多或少是 100 个字符,所以放一些 200 左右)。然后您可以 1) 使用 sprintf 函数写入缓冲区,2) 一次填充一块,或者使用 &sendBuffer[count] 直接写入字符串的末尾,其中 count 是字符数已经写好了(你必须跟踪它或者使用strlen函数)

标签: string arduino microcontroller zigbee


【解决方案1】:

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

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

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

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

检查包丢失{ //使用时间比较

//使用总长度

}

Xbee 可以发送完整的电报,但没有必要!

我认为,由于硬件导致丢包,因为两个天线在平面上都没有很好地定向

【讨论】:

    【解决方案2】:

    无需将所有数据放入单个缓冲区并使用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');
    

    【讨论】:

    • 这个方法是否也允许直接发送浮点数,例如3999.99。由于这个原因,我作为字符串发送,在接收方,我将其转换回浮点数,
    • 试试看吧。 Serial.print() 格式浮动。
    猜你喜欢
    • 2012-02-02
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多