Помогите разобраться с Serial.readString

megamax
Offline
Зарегистрирован: 23.10.2016

Собрал на Меге:

Ком2 соеденен с ком3

в коде описал где происходит сбой. 

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);
  Serial3.begin(9600);
  Serial.setTimeout(100);
}
void loop() {
 if (Serial.available() > 0){        //посылаем xxx
 String ard = Serial.readString();    //получаем ххх
Serial3.println(ard);                 //отправляем на ком 3
String ard2 = Serial2.readString();   //считываем с ком2
//ard2="xxx";
Serial.print("1");Serial.println(ard2);  //выводим результат, приходит ххх
if (ard2=="xxx")                           //сравниваем результат. НЕУДАЧА
{Serial.print("2");Serial.println(ard2);}
}}

если раскоментировать //ard2="xxx"; сравнение естественно работает 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Видимо все дело в символах \r\n

megamax
Offline
Зарегистрирован: 23.10.2016

причем если сравнивать сразу с ком порта - получаем удачу

......................................
String ard = Serial.readString();    //получаем ххх
 if (ard=="xxx")                           //сравниваем результат. УДАЧА
{Serial.print("3");Serial.println(ard);}
.......................................................

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Ты используешь println, а она добавляет после строки \r\n потому и получаешь лажу. Используй print вместо println

megamax
Offline
Зарегистрирован: 23.10.2016

Andy пишет:

Видимо все дело в символах \r\n

пробовал так:

Serial3.print(ard);                 //отправляем на ком 3
Serial3.print("\r\n");
и
Serial3.print("\n");
и
Serial3.print("\r");
 
не помогло
megamax
Offline
Зарегистрирован: 23.10.2016

Andy пишет:

Ты используешь println, а она добавляет после строки \r\n потому и получаешь лажу. Используй print вместо println

Спасибо!!! Завелось

megamax
Offline
Зарегистрирован: 23.10.2016

Еще вопрос, как ускорить прием?

Serial.setTimeout(100);    какой минимум при котором не потеряются данные?

Serial.read(); быстро, но ограничен в количестве передаваемых данных

Serial.readString(); долго ждет

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

megamax пишет:

Еще вопрос, как ускорить прием?

Serial.begin(100500);

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

megamax пишет:

Еще вопрос, как ускорить прием?

Serial.setTimeout(100);    какой минимум при котором не потеряются данные?

Serial.read(); быстро, но ограничен в количестве передаваемых данных

Serial.readString(); долго ждет

В принципе, Калапуций, хотя и, как всегда, в своем стиле, но дал правильный совет - увеличить скорость порта хотя бы до 115200.

Но, вообще говоря, чтобы освободить время для чего-нибудь полезного, целесообразно принимать строку по одному символу. Т.е. узнаем, есть ли что-либо из Serial, если есть - читаем байт и добавляем к текущей строке, после чего проверяем, не закончилась ли строка, если закончилась - реакция на строку и освобождение последней. И идем дальше. Вне зависимости от того, принято ли все, что нужно. Если пока не все - остальное примем на следующем проходе цикла.

Собственно, при правильно организованном обмене таймаут сообще не нужен.