serial.println(String) печатает # вместо строки

я просто пытаюсь получить строку, используя серийный номер, и отправить эту строку обратно. Поэтому, когда я отправляю строку на Arduino через последовательный порт, Arduino должен автоматически отправить эту строку обратно.

я создал этот код:

String test;

void setup(){
  Serial.begin(9600);
  Serial.setTimeout(2);
  test = "null";
}

void loop(){
  if(Serial.available()){
    test = Serial.readString();
  }
  Serial.println(test);
}

Я думаю, это не так сложно понять. Однако теперь arduino всегда будет печатать «#» вместо переменной test. Мое подключенное последовательное устройство представляет собой модуль Bluetooth. (hc-06)

Что я сделал не так?

Благодарю вас!

(я также запускал этот код в эмуляторе Arduino 123D Circuits. Там он работал просто отлично)


person Dides1948    schedule 30.04.2016    source источник
comment
Что такое тип «Строка»?   -  person Martin James    schedule 01.05.2016


Ответы (1)


Вам нужно изменить код. Переместите println в оператор if.

Попробуйте увеличить интервал ожидания, 2 мс недостаточно, хорошее значение (на 9600) лежит выше 10 мс. Теоретически таймаут должен быть не менее 3,5 символов, что для текущей скорости составляет ~0,4 мс. Но на практике используются более высокие значения.

String test;
void setup(){
  Serial.begin(9600);
  Serial.setTimeout(10);// or more
  test = "null";
}
void loop(){
  if(Serial.available()){
    test = Serial.readString();
    Serial.println(test);// moved into if
  }
}

Обновление: еще одно простое решение для возврата символов выглядит так:

void loop(){
      if(Serial.available()) Serial.write(Serial.read());
}

Обновление 2: аналогичная проблема с модулем BLE HM10 (клон, не официальный). Он отправлял около 15 фиктивных байтов до любого массива. А я не решил. Но если устаревшие байты всегда одинаковы, вы можете сделать простой трюк, используя String.remove(). :

if(Serial.available()){
        test = Serial.readString();
        test.remove(0,5);
        // test.remove - add code to remove last character
        Serial.println(test);
 }

Также попробуйте другой терминал.

person Vladimir Tsykunov    schedule 01.05.2016
comment
Сорри, непонятно: вы получаете то, что отправляете или нет? Или у вас есть дополнительная строка до ожидаемой. - person Vladimir Tsykunov; 02.05.2016
comment
Извините, я не дополнил ответ. Я имею в виду, что если я пошлю привет, он вернет *12|99|99|hello#. Таким образом, значение тестовой переменной есть, но есть и эти запутанные символы. - person Dides1948; 02.05.2016
comment
Попробуйте код из обновления, дайте мне знать, если вы получите запутанные символы. - person Vladimir Tsykunov; 03.05.2016
comment
все равно получается :( - person Dides1948; 03.05.2016
comment
Хороший. Это означает, что вы отправляете эти символы, какой терминал вы используете? - person Vladimir Tsykunov; 03.05.2016
comment
Я использую модуль bluetooth, который подключен к разъему reveicer и передатчика. Я запитал его от контакта 5v. Для отправки данных в модуль Bluetooth я использую телефон Android с приложением ArduDroid (от TechBitar). - person Dides1948; 03.05.2016
comment
опубликовано обновление, если количество избыточных байтов всегда одинаково - person Vladimir Tsykunov; 03.05.2016