itehno
19.Июль.2023 07:27:18
1
Добрый день.
Библиотека SoftwareSerial позволяет подключить два устройства и работать с ними по очереди при помощи listen.
Каждое устройство на своих пинах корректно передает данные, но когда я пытаюсь принять их по очереди, данные не принимаются.
Вот пример кода:
#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) {
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) {
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]);;
}
Передача и приём - это разные виды деятельности и зоны ответственности. Таймлайн передачи зависит от МК, а приёма - зачастую нет.
Komandir:
Читать научитесь !!!
Так у него чтение не работает - он же так и написал. Только писать может.
Я про текст в окне ввода сообщения на форуме !!!
itehno
19.Июль.2023 07:49:22
7
Тег вставки куска кода в форме ввода сообщений не нашёл - можете ткнуть “новичка”.
Я понимаю, что тему для шуток при желании можно найти по любому поводу, но давайте все же по существу.
Нажмите кнопку “Ответить”, сделайте скриншот и вставьте его сюда - покажем куда смотреть.
Теги на шестеренке !
Это сознательно или ошибка ?
itehno
19.Июль.2023 08:02:52
12
Это я ошибся при максимальном сжатии кода для примера
itehno
19.Июль.2023 08:05:17
13
Коллеги, тему поправил, есть у кого-нибудь соображения?
Код я максимально упростил и протестировал. Каждое устройство корректно работает на своих пинах, но как только я добавляю portTwo.listen();, то данные с первого порта равны 0.
А вы уверены что пока вы слушаете/принимаете с порт2, данные не улетают в никуда на порт1 - их же никто не принимает и они пропадают …
itehno
19.Июль.2023 08:10:21
15
Да, данные “приходят” только при выполнении portOne.write(0x4a); или portTwo.write(0x4c);
Проблема в том, что я даже делал так:
void loop() {
one();
delay(100);
two();
delay(100);
}
void one(){
portOne.listen();
portOne.write(0x4a);
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();
}
… и данные с первого устройства переставали приходить
Возьмите чип по задаче - в данном случае MEGA …
itehno
19.Июль.2023 08:14:05
17
К сожалению это не возможно
b707
19.Июль.2023 08:15:46
18
вот этот код мне нравится, как вы думаете что он напечатает?
b707
19.Июль.2023 08:17:16
19
почему? Есть и маленькие платы с большим количеством УАРТ портов.
То время, которое вы потратите на отладку глючного СофтСериала, однозначно дороже смены платы.
itehno
19.Июль.2023 08:18:16
20
Это минимальный пример для обсуждения, все работает по другому.