【问题标题】:Arduino serial data manipulation - Sensors Serial Data, Read and parse to variablesArduino 串行数据操作 - 传感器串行数据,读取和解析变量
【发布时间】:2019-01-07 16:36:09
【问题描述】:

我通过无线技术 (xbee) 从 Arduino 1(路由器)的 3 个传感器发送 3 组数据到另一个 Arduino(协调器): 在协调器上,我完美地从这 3 个传感器(来自路由器)接收无线数据。数据流是这样的(每个传感器数据都在其线上):

22.5624728451
944
8523

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

温度=22。 5624728451
气体=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 个变量)分配一个变量,然后将这些值传递给程序的其余部分。有谁知道如何修改代码以在这种情况下工作? 提前谢谢!

【问题讨论】:

  • 谢谢。我会尝试你的第一个建议。我不明白的替代建议,但我会尝试使用分隔符的方法。非常感谢你!祝你有美好的一天!

标签: string arduino xbee node-xbee


【解决方案1】:

如果您承诺使用字符串值,我建议您将值连接到发送端的同一行,并在接收端使用逗号等分隔符和string.split()。编辑:看来 Arduino 没有string.split() 功能。示例见this conversation

另一种方法是设置标准字节长度并将数字作为二进制而不是表示数字的 ASCII 编码字符串发送。请参阅 Arudino 论坛上的 this post 了解一些背景知识。我建议以原始字节表示法发送数字,而不是 ASCII 字符。当您在 arduino 上将变量定义为整数时,它默认为 16 位有符号整数值。浮点数是一个 32 位浮点数。例如,如果您发送一个浮点数和两个整数作为二进制值,浮点数将始终是前 4 个字节,第一个整数,下一个 2,最后一个整数是最后一个 2。字节的顺序 (endianness,或最高有效字节优先(Big Endian,摩托罗拉风格)/最低有效位优先(Little Endian,Intel 风格))。

【讨论】:

  • 现在我有这样的字符串 21.95$433&1324* 。 "$","&" 和 "*" 是我的分隔符。我不知道如何使用 string.split 但我使用过 String.readStringUntil('delimiter');但不要在我的代码上工作:例如: temperature = String.readStringUntil('$'); ...我不知道我做错了什么。你可以根据我的代码给我一个 string.split() 的例子吗?
  • 看来arduino没有'string.split()'方法。我更新了我的答案,以包含一个链接,指向你正在尝试做的事情的实际方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多