Коммутатор потоков с несколькими последовательными портами
Я пытаюсь определить несколько последовательных портов (несколько плат управления BMS) и выбрать через глобальную переменную активный порт, это скетч, который я пытаюсь изменить.
https://github.com/bres55/Smart-BMS-arduino -Reader/blob/master/smart_bms_reader_Mega_v11.ino
Функция, которую я хочу написать, могла бы называться "MySerialSwitch"
В smart_bms_reader_Mega_v11.ino есть 19 вызовов серийного номера в различных функциях. Я хочу иметь возможность определить «активный» MySerial в переменной, которую можно изменить на лету.
Что-то вроде этого.
#include <SoftwareSerial.h>
SoftwareSerial MySoftSerial1(10, 11); // RX, TX
SoftwareSerial MySoftSerial2(12, 13); // RX, TX
#define MySerial1 MySoftSerial1
#define MySerial2 MySoftSerial2
#define MySerial3 Serial3
char MySerialPort[] = "MySerial1";
void setup()
{
MySoftSerial1.begin(9600);
MySoftSerial2.begin(9600);
Serial3.begin(9600);
}
Эта функция будет изменена
void call_get_cells_v()
{
flush(); // сначала очистить
uint8_t data[7] = {221, 165, 4, 0, 255, 252, 119};
MySerial.write(data, 7);
}
читать.
void call_get_cells_v()
{
flush(); // сначала очистить
uint8_t data[7] = {221, 165, 4, 0, 255, 252, 119};
MySerialSwitch.write(data, 7);
}
Я изучал этот пост
Как определить объект SoftwareSerial внутри класса?
И этот пост
Запись первой библиотеки — объект последовательного потока
Это моя первая попытка создать библиотеку, я думаю, что это то, чего я пытаюсь достичь, я читал в потоке, ссылки и указатели. Я еще не совсем ясно. Буду очень признателен за помощь.
class MySerialSwitch {
private:
Stream *_dev;
public:
MySerialSwitch(Stream *dev) : _dev(dev) {}
MySerialSwitch(Stream &dev) : _dev(&dev) {}
(char MySerialPort);
};
(int pos) {
_dev->write(char MySerialPort);
}
@Paul Fisher, 👍-1
Обсуждение1 ответ
Я нашел этот пост, я не думаю, что он будет переключаться между серийным номером оборудования и серийным номером программного обеспечения, но он определенно работает только для программного обеспечения.
#include <SoftwareSerial.h>
SoftwareSerial MySoftSerial1(10, 11); // прием, передача
SoftwareSerial MySoftSerial2(12, 13); // прием, передача
SoftwareSerial *MySerial;
void setup()
{
Serial.begin(115200);
MySoftSerial1.begin(9600);
MySoftSerial2.begin(9600);
}
void loop()
{
MySerial = &MySoftSerial1; // Запрос 1-й BMS
//или меняем порт
MySerial = &MySoftSerial2; //Запросить вторую BMS
// Я должен был все экземпляры MySerial.write записать в MySerial->write
}
Я буду продолжать читать, чтобы понять, что я сделал, но если кто-то захочет объяснить, я был бы очень признателен.
Это сообщение, из которого я получил метод.
https://forum.arduino.cc/index.php?topic=605453.0
Спасибо
- Создать новый серийный класс, наследующий от Stream
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Как работает последовательная связь на Arduino?
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
простите, в чем вопрос? Одна проблема, которую я вижу, заключается в том, что для SotwareSerial вы должны выбрать, какой из них прослушивает с помощью функции listen(). и что SoftwareSerial не работает на многих выводах Mega, @Juraj
Я думаю, что у меня это получилось, я понятия не имею, как, это объясняет немного больше https://forum.arduino.cc/index.php?topic=605453.0, @Paul Fisher