Не удается прочитать значения, хранящиеся в указателе 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

Как получить из него логическое результирующее значение?

, 👍-1

Обсуждение

пожалуйста, добавьте полный текст сообщения об ошибке, @jsotola

Указатель катушки указывает на какое-то случайное место, поскольку вы не потрудились определить для него какое-либо значение (зависит от того, что было в памяти, где этот указатель получает пространство)., @KIIV

bool coils; и mb.readCoil(1, 1, &coils, 1, cb);. таким образом, функция может получить значение переменной coil., @Juraj


1 ответ


Лучший ответ:

0

При программировании Arduino вы на самом деле пишете на языке C. Таким образом, вы можете искать в Интернете ответы на C-программирование, из которых, вероятно, есть 50 лет ответов.

Вы определили "катушки" как указатель. Это делается путем предшествования имени звездочкой в том месте, где оно определено. В этой строке кода:

bool* coils;

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

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

Начинающие программисты часто находят указатели запутанными. Но позже мы находим указатели очень полезными инструментами, которые упрощают многие другие сложные программы.

Подумайте о том, чтобы опустить звездочку перед "катушками" в двух строках кода, где она существует, и попробуйте запустить программу еще раз.


Добавлено позже:

Предположим, что вызов функции readCoil, которая предполагается определенной в ModbusRTU.h, требует передачи указателя в качестве 3-го формального параметра переменной. Это более продвинутое программирование на языке Си. Если true, то сохраните исходный код, но добавьте строку кода, устанавливающую значение "coils" в адрес новой переменной bool. Возможно, что-то в этом роде:

bool* coils;
bool coils_value;
coils = &coils_value;
,