Не удается прочитать значения, хранящиеся в указателе bool*
Я пытаюсь прочитать значения, хранящиеся в указателе bool*, из вызова катушки modbus.
Я использую библиотеку modbus-esp8266. все в порядке с входными регистрами и регистрами хранения, но я не могу прочитать результат чтения катушки.
#include <ModbusRTU.h>
#include <SoftwareSerial.h>
SoftwareSerial S(D2, D1);
ModbusRTU mb;
bool cb(Modbus::ResultCode event, uint16_t transactionId, void* data) { // Callback to monitor errors
if (event != Modbus::EX_SUCCESS) {
Serial.print("Error result: 0x");
Serial.print(event, HEX);
}
return true;
}
void setup() {
Serial.begin(115200);
S.begin(9600, SWSERIAL_8N1);
mb.begin(&S);
mb.master();
}
void loop() {
bool* coils;
if (!mb.slave()) { // Check if no transaction in progress
mb.readCoil(1, 1, coils, 1, cb); // Send Read Hreg from Modbus Server
while(mb.slave()) { // Check if transaction is active
mb.task();
delay(10);
}
Serial.println(*coils);
}
delay(1000);
}
Я получаю такую ошибку при попытке напечатать *катушки
Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads
Как получить из него логическое результирующее значение?
@MarioC, 👍-1
Обсуждение1 ответ
Лучший ответ:
При программировании Arduino вы на самом деле пишете на языке C. Таким образом, вы можете искать в Интернете ответы на C-программирование, из которых, вероятно, есть 50 лет ответов.
Вы определили "катушки" как указатель. Это делается путем предшествования имени звездочкой в том месте, где оно определено. В этой строке кода:
bool* coils;
Это означает, что вы используете катушки для хранения ячейки памяти, в которой должно храниться фактическое значение. Однако в случае кода в опубликованном вопросе ячейка памяти, в которой должно храниться фактическое значение, никогда не определяется.
Это все равно что идти по хижине с плохой подсказкой. Вы получаете инструкции, чтобы получить следующую подсказку в определенном месте. Но когда вы доберетесь туда, то не найдете никаких дальнейших инструкций.
Начинающие программисты часто находят указатели запутанными. Но позже мы находим указатели очень полезными инструментами, которые упрощают многие другие сложные программы.
Подумайте о том, чтобы опустить звездочку перед "катушками" в двух строках кода, где она существует, и попробуйте запустить программу еще раз.
Добавлено позже:
Предположим, что вызов функции readCoil, которая предполагается определенной в ModbusRTU.h, требует передачи указателя в качестве 3-го формального параметра переменной. Это более продвинутое программирование на языке Си. Если true, то сохраните исходный код, но добавьте строку кода, устанавливающую значение "coils" в адрес новой переменной bool. Возможно, что-то в этом роде:
bool* coils;
bool coils_value;
coils = &coils_value;
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Есть ли хорошая рабочая библиотека MODBUS TCP master для Arduino?
- Ведомая библиотека Modbus RTU
- Почему считается плохой практикой использовать ключевое слово "new" в Arduino?
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Modbus IP с Simply Modbus TCP
- Проблемы с преобразованием uint32_t в char*
пожалуйста, добавьте полный текст сообщения об ошибке, @jsotola
Указатель катушки указывает на какое-то случайное место, поскольку вы не потрудились определить для него какое-либо значение (зависит от того, что было в памяти, где этот указатель получает пространство)., @KIIV
bool coils;
иmb.readCoil(1, 1, &coils, 1, cb);
. таким образом, функция может получить значение переменнойcoil
., @Juraj