Есть эта плата для встройки в корпус с 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 …
Нет, к сожалению это не так. Я сегодня доберусь до анализатора и проверю, улетают ли 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]);;
}
Может понадобится изменить условие ожидания и ждать НУЖНОЕ количество байт, а не первый из них !!!