Не корректно работает SoftwareSerial

В примере к библиотеке, на основе которого скетч видимо и написан, не зря написано - "выбирайте логичное время для переключения, например когда передача закончена или буфер пустой… " Видимо здесь это не соблюдается. Послали команду, ничего ещё в ответ не получили - пролетаем дальше. Переключение на второй порт может вызываться как раз когда на первый ответ пришёл.

1 лайк

Большой размер данных, обрабатываю сдвигом

Огромное спасибо, произошли изменения. Буду разбираться, позже отпишу по результату.

Тогда формулируйте задачу по чипу (чудес не бывает).

@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("-----");
}

и будет Вам много счастья.

1 лайк

Да, согласен, описание темы с моей стороны выглядело не профессионально.

Сдвигом чего? У вас же это массив из двух элементов, в каждый элемент записывается один байт, так? Зачем тогда размер элементов массива в 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