В примере к библиотеке, на основе которого скетч видимо и написан, не зря написано - "выбирайте логичное время для переключения, например когда передача закончена или буфер пустой… " Видимо здесь это не соблюдается. Послали команду, ничего ещё в ответ не получили - пролетаем дальше. Переключение на второй порт может вызываться как раз когда на первый ответ пришёл.
Большой размер данных, обрабатываю сдвигом
Огромное спасибо, произошли изменения. Буду разбираться, позже отпишу по результату.
Тогда формулируйте задачу по чипу (чудес не бывает).
@itehno, на будущее, очень прошу Вас, никогда не используйте выражений типа:
Бесит до безобразия и вызывает непреодолимое желание ответить: “Некорректно работает голова ТС”, что, кстати, в большинстве случае (и в Вашем тоже) - будет чистой правдой.
Код работает именно так, как Вы его написали. Давайте разбираться.
Строки №№ 25 и 26. С чего Вы взяли, что байт успел прийти в промежуток времени между этими строками? А подождать пока придёт, не судьба? Если не успел то Вы просто проскочите приём, понимаете?
Далее, строки №№ 27-28. То же самое! Кто Вам сказал, что байт успел прийти?
Теперь Ваше заявление:
Вы просто невнимательно смотрели. Данные передаются далеко не всегда корректно. Просто валятся “не нули”, а скрупулёзно Вы не проверяли. Там хватает пропусков и сбоев. Привыкайте проверять внимательно.
Замените Ваши функции чтения на более корректные
с ожиданием прихода байта
void one(){
portOne.listen();
portOne.write(0x4a);
while (! portOne.available()); // ждём прихода байта
read_1[0] = (portOne.read()); // читаем
while (! portOne.available()); // ждём прихода байта
read_1[1] = (portOne.read()); // читаем
Serial.println("--- PORT ONE");
Serial.print("read_1[0]: "); Serial.println(read_1[0]);
Serial.print("read_1[1]: "); Serial.println(read_1[1]);
Serial.println("-----");
}
void two(){
portTwo.listen();
portTwo.write(0x4c);
while (! portTwo.available()); // ждём прихода байта
read_2[0] = (portTwo.read()); // читаем
while (! portTwo.available()); // ждём прихода байта
read_2[1] = (portTwo.read()); // читаем
Serial.println("--- PORT TWO");
Serial.print("read_2[0]: "); Serial.println(read_2[0]);
Serial.print("read_2[1]: "); Serial.println(read_2[1]);;
Serial.println("-----");
}
и будет Вам много счастья.
Да, согласен, описание темы с моей стороны выглядело не профессионально.
Сдвигом чего? У вас же это массив из двух элементов, в каждый элемент записывается один байт, так? Зачем тогда размер элементов массива в 4 байта?
Это код для примера. Он максимально упрощен.
Вот код решения моей задачи:
portOne.listen();
portOne.write(0x4a);
unsigned long Time = millis(); // Сохраняем время начала ожидания данных
int index = 0;
while (index < 5 && millis() - Time < 50) { // Ожидаем до 50 мс или пока не получим все 5 байт
if (portOne.available()) { // Если есть данные в порту
read_1[index] = portOne.read(); // Считываем их
index++; // Увеличиваем индекс массива
}
}
Коллеги, огромное спасибо всем за помощь.
Особая благодарность Komandir