ModbusMaster.h — изменение узла

Я использую библиотеку ModbusMaster.h в проекте с arduino-uno и преобразователем TTL/RS-485, и функция должна идентифицировать подчиненное устройство, с которым она обменивается данными. Число подчиненных варьируется от 1 до 16. После того, как я начал соединение,

ModbusMaster node(1);
node.begin(9600);

Мне нужно отправить сообщение, и если это сообщение вернет ошибку, мне придется изменить номер подчиненного устройства, пока я не получу действительный ответ. Но никаких функций закрыть это соединение или удалить его я не нашел, даже пробовал,

delete &node;

но это не сработало. Я пытаюсь закрыть это соединение, чтобы начать новое с другого узла, потому что я не нашел функции для изменения номера подчиненного устройства.

, 👍2

Обсуждение

Я не вижу никакой функции для изменения _u8MBSlave, кроме [конструктора](https://github.com/4-20ma/ModbusMaster/blob/master/ModbusMaster.cpp#L66). Мой C не очень хорош, вы можете попробовать что-то вроде node = ModbusMaster(2);, @Gerben

Вообще говоря, вам никогда не следует вызывать команду delete для чего-либо, если вы изначально не создали это с помощью команды new. Попытка удалить объект из стека может привести к сбою вашей программы или другим неправильным действиям., @Peter Bloomfield

Действительно, это не сработает. Но почему бы не ModbusMaster* node = new ModbusMaster(id), затем отправить, проверить на наличие ошибок, если да, delete *node, ++id, повторить? Не самый эффективный, но простой. (Вы также можете добавить функцию для изменения идентификатора библиотеки.), @fuenfundachtzig

Гербен, не получилось, =/. Спасибо за совет, Питер. Фуэнфундахциг, как ты это произносишь? Ооо, но это тоже не сработало. Но для решения мне пришлось создать функцию, которая продолжает создавать новые узлы, и каждый раз, когда она создает новый узел, она отправляет запрос, и если запрос был ошибкой, она переходит к созданию другого узла, если ответ был бы успешен, то было бы сделано: ModbusMaster node4(4) "если успех был с 4-й попытки", затем: node4.begin(); узел = узел4;, @Claudiaum


1 ответ


2

Возможно, этот вопрос слишком старый и API изменился, поэтому мой ответ — справочный.

Конструктор ModbusMaster не принимает параметры.

После чтения исходного кода метод begin(uint8_t подчиненный, Stream &serial) просто инициализирует переменные и может быть вызван снова с новым значением slave без необходимо уничтожить объект ModbusMaster.

Ссылка:

[1] https://github.com/4-20ma/ModbusMaster/ blob/master/src/ModbusMaster.cpp, строка 61.

,