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

Есть эта плата для встройки в корпус с 3D принтера, другая не подойдет.

Вы проверяете available > 0 сразу после переключения и отправки 0x4a. Вам еще не успели ответить, и “по хорошему” available всегда должен быть равен 0, но может зависеть от реализации библиотеки.
Нарисуйте для себя временной график взаимодействия по serial, с учетом времен на обработку и ответ, и составьте новый алгоритм.

Я пробовал разными способами (с задержкой большей или вовсе без последней), но разве условие не предполагает, что следующий этап выполнения программы не будет выполнен пока данные поступают в порт?

while (portOne.available() > 0) {
    if (portOne.available()) { read_1[0] = (portOne.read()); }
    if (portOne.available()) { read_1[1] = (portOne.read()); }
  }

Замечательно.
Предлагаете нам потратить время на решение выдуманной проблемы, а потом окажется что найденный ответ не подходит к реальной задаче и все придется начинать с начала?

Я пас

А они успевают начать поступать?

с какой стати? Если в порту ничего нет, while просто пролетает мимо

Вы меня не правильно поняли. Данные приходят даже в этом скудном примере, но только если я не использую portTwo.listen();

Все верно, но если они все же пришли, то данный код нам их должен показать, но они равны 0.

Serial.print("read_1[0]: "); Serial.println(read_1[0]);

значит они приходят, но равны нулю

Автобус пассажиров на остановке не ждет по полчаса. Нет никого - уехал.

А зачем вообще столько проверок? Ясен пень, что в цикл попасть можно только если больше нуля.

while (portOne.available() > 0) {
    read_1[0] = (portOne.read());
    read_1[1] = (portOne.read());
}

Попробуйте переинициализировать данные с 0xFF …

1 лайк

Нет, к сожалению это не так. Я сегодня доберусь до анализатора и проверю, улетают ли portOne.write(0x4a) и portTwo.listen()

Кстати, а функция portOne.read() что возвращает? Байт?

Порты у вас в эхо режиме закорочены или друг на друга ?

Конечно не так. Я вам выше уже указывал, что у вас данные печатаются НЕЗАВИСИМО от того, пришло ли что-то в порт или нет.
Воспользуйтесь советом @Komandir и заполните массивы чем-то отличным от нуля, чтобы видеть, печатаются ли реальные данные или пустышка.
Или внесите печать внутрь условия чтения порта,

Кусок вашего кода, который я процитировал в №18 - неверный по логике

Да, возвращает байты, далее я из обрабатываю

У меня два независимый устройства, которые по запросу отдают данные. Они не завязаны друг на друга.

А почему тогда read_1 и read_2 размером в 4 байта каждый? Для чего?

Тогда после отправки данных - ждите ответа
while (порт.available() == 0) ;

А уже потом вынимайте пока они есть в буфере !!!

#include <SoftwareSerial.h>
SoftwareSerial portOne(4, 7);
uint32_t byte_1 = 0;
uint32_t read_1[2] = {};

SoftwareSerial portTwo(2, 8);
uint32_t byte_2 = 0;
uint32_t read_2[2] = {};

void setup() {
  Serial.begin(9600);
  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop() {
  one();
  delay(100);
  two();
  delay(100);
}

void one(){
  portOne.listen();
  portOne.write(0x4a);
  while (portOne.available() == 0); // ждём ответ
  while (portOne.available() > 0) {
    if (portOne.available()) { read_1[0] = (portOne.read()); }
    if (portOne.available()) { read_1[1] = (portOne.read()); }
  }

  Serial.print("read_1[0]: "); Serial.println(read_1[0]);
  Serial.print("read_1[1]: "); Serial.println(read_1[1]);
}

void two(){
  portTwo.listen();
  portTwo.write(0x4c);
  while (portTwo.available() == 0); // ждём ответ
  while (portTwo.available() > 0) {
    if (portTwo.available()) {read_2[0] = (portTwo.read());}
    if (portTwo.available()) {read_2[1] = (portTwo.read());}
  }

  Serial.print("read_2[0]: "); Serial.println(read_2[0]);
  Serial.print("read_2[1]: "); Serial.println(read_2[1]);;
}

Может понадобится изменить условие ожидания и ждать НУЖНОЕ количество байт, а не первый из них !!!

2 лайка