Столкнулся с непонятным поведением 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();
}
}
делал.
в самом первом подходе думал по наличию данных в порту определять, подключено устройство или нет. данные были всегда. если не подключено устройство, там всегда либо какой-то мусор, либо команда запроса и мне всегда писало ok
Она ждёт в течение установленного Вами таймаута (Вы не устанавливаете, но он есть по умолчанию). Поставьте таймаут поменьше и будет ждать меньше. Там у сериала есть метод setTimeout
Совсем не ждать он не может потому, что ему надо дождаться какого-то символа после числа (или таймаута). Вот прикиньте, он вводит число. Ввёд цифры 1и 2, что ему делать? Возвращать 12? А вдруг там ещё цифра есть? Поэтому он будет ждать пока после цифр не появится “не цифра” или до истечения таймаута.
Схемы не видел, но логично, что на каждый пин свой подтягивающий резистор.
Если что - это я о теоретически возможной аппаратной неисправности - завышенном сопротивлении подтяжки на пине.
Намёк не понял, увы.
Из даташита:
Порт D — это 8-битный двунаправленный порт ввода-вывода с внутренними подтягивающими резисторами (выбранными для каждого бита).