Долго читает из serial3 без подключения платы к компьтеру

Всем привет!

Столкнулся с непонятным поведением serial3 на mega.
Делаю проверку подключения устройства к плате mega2560 - после инициализации serial1, отправляю запрос на получение значения параметра устройства, должен прийти ответ со значением (запрос напряжения в сети). ответ привожу к int. Если устройство подключено, то отвечает почти в ту же миллисекунду, buf не равен 0 и на экране мне пишет OK. Если не подключено, то parseInt() спотыкается на мусоре или на отправленной же команде, buf равен 0 и пишет error. В общем, когда отлаживаюсь (mega подключена к компьютеру и в мониторе порта смотрю вывод Serial.println) все работает. Если отключаю кабель от компьютера, то без подключенного устройства, mega висит минут 15 на “long int buf = Serial3.parseInt();”, потом дальше проходит. причем отрабатывает до конца и пишет error. Прошивал с выводом в Serial и без него, игрался с Serial1.setTimeout(100) - ничего не меняется. Подключенный кабель как то влияет на чтение из Serial3. Если в эти 15 минут подключить кабель, то через пару секунд процесс отвисает и доходит до конца, написав error на экране.

Вопрос: что нужно сделать, чтобы без подключения к компьютеру работало так же быстро?

void setup () {
  Serial.begin(115200);

  Serial3.begin(9600);
  //Serial3.setTimeout(100);
  Serial3.println("AT+VI?");
  delay(100)
  long int buf = Serial3.parseInt();
  //Serial3.setTimeout(1000);
  if (buf != 0) {
    writeToScreen("OK");
    Serial.println("OK");
  }
  else {
    writeToScreen("error");
    Serial.println("error");
   Serial3.end();
  }
}

а проверить

 if (Serial3.available() > 0) {

не пробовали перед

  long int buf = Serial3.parseInt();

делал.
в самом первом подходе думал по наличию данных в порту определять, подключено устройство или нет. данные были всегда. если не подключено устройство, там всегда либо какой-то мусор, либо команда запроса и мне всегда писало ok

опечатки есть в первом сообщении - работаю с serial3 и отладка в serial. serial1 не используется. не вижу как отредактировать

Странно. На других портах то же самое пробовали?

не успел еще. пока без доступа к плате. ближе к ночи проверять буду

Проверьте, возможно порт “косячит”

Так себе идея. Проверяете Вы первый байт, а не int целиком.

я согласен, это была концепция ))

Она ждёт в течение установленного Вами таймаута (Вы не устанавливаете, но он есть по умолчанию). Поставьте таймаут поменьше и будет ждать меньше. Там у сериала есть метод setTimeout

Совсем не ждать он не может потому, что ему надо дождаться какого-то символа после числа (или таймаута). Вот прикиньте, он вводит число. Ввёд цифры 1и 2, что ему делать? Возвращать 12? А вдруг там ещё цифра есть? Поэтому он будет ждать пока после цифр не появится “не цифра” или до истечения таймаута.

Поставьте подтягивающий резистор на 10 кОм на Rx Serial 3
Возможно при отключенном устройстве, ловятся наводки.

1 лайк

Пробовал ставить 100. На фоне 15 минут ожидания разницы не видно. В воде как раз закомментирована команда

Интересная мысль, спасибо. Попробую, если смена порта не изменит ситуацию.

Так может , дело именно в 3 порте, в слабой внутренней подтяжке на пине RX… В этом случае, добавка резистора может помочь.

а у первого и второго другая “внутренняя подтяжка” ?

Схемы не видел, но логично, что на каждый пин свой подтягивающий резистор.
Если что - это я о теоретически возможной аппаратной неисправности - завышенном сопротивлении подтяжки на пине.

Когда ТС проверит на других портах - станет яснее

ключевое словосочетание - “внутренняя подтяжка" )

Для первичной диагностики достаточно форвардить байты из Serial3 в Serial.

1 лайк

Намёк не понял, увы.
Из даташита:
Порт D — это 8-битный двунаправленный порт ввода-вывода с внутренними подтягивающими резисторами (выбранными для каждого бита).

Т.е. резистор на каждый пин, или я не “въезжаю”?

В даташите показана схема IO пина, там нарисовано все, что интересует…