Конкатенация строк с Arduino
У меня есть очень короткий пример программы, работающей на устройстве Arduino Fio. Эта программа отправляет серийные данные. Подключенное маршрутизатор Xbee получает эти данные и отправляет их на устройство координатора Xbee, подключенное к моему ноутбуку. Программа также считывает данные с последовательного порта. Я могу отправить 1
или 0
включить или выключить светодиод устройства Fio.
Включение или выключение светодиода путем отправки 1
или 0
из терминала на моем ноутбуке работает хорошо.
Но когда я пытаюсь прочитать данные, которые отправляет устройство Fio, я получаю следующее:
his direction works
is direction works
s direction works
direction works
direction works
irection works
rection works
ection works
ction works
... и так далее.
Но я ожидаю строку ("This direction works " + counter++;
), как вы можете видеть в следующем примере кода.
Вот короткий набросок Arduino:
int incomingByte = 0; // for incoming serial data
int counter = 0;
void setup()
{
Serial.begin(57600);
pinMode(13,OUTPUT);
// blink twice at startup
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH); // first blink
delay(50);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH); // second blink
delay(50);
digitalWrite(13, LOW);
}
void loop()
{
// send data only when you receive data:
if (Serial.available() > 0)
{
// read the incoming byte:
incomingByte = Serial.read();
if(incomingByte == '0')
{
digitalWrite(13, LOW);
}
else if(incomingByte == '1')
{
digitalWrite(13, HIGH);
}
// say what you got:
Serial.print("Fio received: ");
Serial.write(incomingByte); // Arduino 1.0 compatibility
Serial.write(10); // send a line feed/new line, ascii 10
}
else
{
String sendData = "This direction works " + counter++;
Serial.println(sendData);
delay(1500);
}
}
Что я делаю не так? Почему я не получаю:
This direction works 0
This direction works 1
This direction works 2
This direction works 3
... и так далее?
1 ответ
Как отметили @Elric и @Olaf в комментариях, сделать это невозможно, как в моем опубликованном коде.
После прочтения документации я снова нашел "объяснение":
Внимание: вы должны быть осторожны при объединении нескольких типов переменных в одной строке, так как вы можете получить неожиданные результаты. Например:
int sensorValue = analogRead (A0); String stringOne = "Значение датчика:"; String stringThree = stringOne + sensorValue;
Serial.println (stringThree);приводит к "значению датчика: 402" или какому-либо аналогу аналога Read(), но
int sensorValue = analogRead(A0); String stringThree = "Значение датчика: " + sensorValue; Serial.println(stringThree);
дает непредсказуемые результаты, потому что stringThree никогда не получал начальное значение, прежде чем вы начали объединять различные типы данных.
Во-первых, вы должны инициализировать переменную String, чтобы присвоить ей две соединенные строки.