我使用无线技术(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个变量),然后将这些值传递给程序的其余部分。有谁知道在这种情况下如何修改代码才能工作? 预先谢谢你!
答案 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风格)。