Arduino串行数据操作-传感器串行数据,读取并解析为变量

时间:2019-01-07 16:36:10

标签: string arduino xbee node-xbee

我使用无线技术(xbee)从Arduino 1(路由器)的3个传感器向另一个Arduino(协调器)发送了3组数据: 在协调器上,我可以完美地从这3个传感器(从路由器)接收无线数据。数据流是这样的(每个传感器数据在其行上):

22.5624728451
944
8523

我希望将这3个值作为3个变量进行不断更新,然后将这些值传递到程序的其余部分,以进行LCD上的打印或其他操作:

温度= 22。 5624728451
gas = 944
烟= 8523

最初,我只有2个传感器,并且将这2个传感器的数据发送如下:
22.5624728451944(22.5624728451-温度,944-气体)和我在同一行上接收到了它们,并将所有内容分成两个变量(使用readString.substring()),代码如下。但是现在我有3个传感器,并且我在单独的行上接收数据,因为我不知道每个数据字符串的长度是什么……而且我不能使用相同的技术(仅发送一个包含所有传感器数据的字符串)。同一行,然后将它们分开)

我的旧代码:

    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12,11,10,9,8,7);  
    String temperature;
    String gas;
    String readString;

    void setup() {
    Serial.begin(9600);          
    lcd.begin(16, 2);                              
    }
    void loop() {
      while (Serial.available() > 0)                             
    {
    char IncomingData = Serial.read();                   
    readString += IncomingData ;       
    temperature = readString.substring(0, 13); //get the first 13 characters
    gas = readString.substring(13, 16); //get the last 3 characters 

    Serial.print(IncomingData);  //here I have my string: 20.1324325452924 wichs is updating properly when I have sensor values changes 

    // Process message when new line character is DatePrimite
    if (IncomingData == '\n')
    {
      Serial.println(temperature);
      lcd.setCursor(0,0);                              
      lcd.write("T:");
      lcd.print(temperature);               
     delay(500);
     temperature = "";                               // Clear DatePrimite buffer

     Serial.println(gaz);
     lcd.begin(16, 2);
     lcd.setCursor(0,1);                              
     lcd.write("G:");
     lcd.print(gas);
     delay(500);
     gaz = "";                                       // Clear DatePrimite buffer
     readString = "";
  }
}

}

我现在要做的就是为不断更新的每个传感器数据分配一个变量(3行–每行3个变量),然后将这些值传递给程序的其余部分。有谁知道在这种情况下如何修改代码才能工作? 预先谢谢你!

1 个答案:

答案 0 :(得分:1)

如果您要使用字符串值,建议您在发送端将这些值连接到同一行,并在接收端使用逗号(如逗号)和string.split()这样的定界符。编辑:看来Arduino没有string.split()函数。有关示例,请参见this conversation

另一种选择是设置标准字节长度,然后将数字作为二进制而不是表示数字的ASCII编码的字符串发送。有关一些背景知识,请参阅Arudino论坛上的this post。我建议以原始字节格式而不是ASCII字符发送数字。当您在arduino上将变量定义为整数时,它默认为16位带符号整数值。浮点数是32位浮点数。例如,如果您发送一个浮点数和两个整数作为二进制值,则浮点数将始终是前4个字节,第一个int,接下来的2个字节和最后一个int的最后2个字节。字节的顺序({{3} },或最高有效字节在前(Big Endian,Motorolla风格)/最低有效位在前(Little Endian,Intel风格)。