необходимо получить значения из функции с аргументом указателя структуры и распечатать на последовательном терминале

c++

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

typedef struct
{
  uint8_t AB;     ///< Адресный байт (стартовый байт)
  uint8_t CB;     ///< Команда (индекс) «ASCII-байт»
  uint8_t SI;     ///< Действие (субиндекс) «ASCII-байт»
  uint8_t PH_1;    ///< Полезная нагрузка «ASCII-байт» старшего полубайта старшего байта необработанной полезной нагрузки
  uint8_t PH_2;    ///< Полезная нагрузка «ASCII-байт» младшего полубайта старшего байта необработанной полезной нагрузки
  uint8_t PL_1;    ///< Полезная нагрузка «ASCII-байт» старшего полубайта младшего байта необработанной полезной нагрузки
  uint8_t PL_2;    ///< Полезная нагрузка «ASCII-байт» младшего полубайта младшего байта необработанной полезной нагрузки
  uint8_t CS1;    ///< Контрольная сумма «ASCII-байт» старшего полубайта необработанной контрольной суммы
  uint8_t CS0;    ///< Контрольная сумма «ASCII-байт» младшего полубайта необработанной контрольной суммы
} rs485_message_t;

int proto485ComposeMsg(rs485_message_t* msg, uint8_t address, uint8_t command, uint8_t action, uint16_t value){
  msg->AB = address;   
  msg->CB = command;
  msg->SI = action;
  msg->PH_1 = (int)((value & 0xF000) >> 12) ; 
  msg->PH_2 = (int)((value & 0x0F00) >> 8); 
  msg->PL_1 = (int)((value & 0x00F0) >> 4) ; 
  msg->PL_2 = (int)(value & 0x000F);     
  int checksumRaw = (msg->CB) + (msg->SI) + (msg->PH_1) + (msg->PH_2) + (msg->PL_1) + (msg->PL_2);
  setCheckSum(msg);
}

uint8_t proto485Write(uint8_t address, uint8_t command, uint8_t action, uint16_t value)
{
  int i = 0;     
  int stringOne[9] = {int(0x00), int(0x00), int(0x00), int(0x00), int(0x00), int(0x00), int(0x00), int(0x00), int(0x00)}; ;
  rs485_message_t rs485Msg;
  proto485ComposeMsg(&rs485Msg, address, command, action, value); // значение передается в «сыром» формате
  Serial.write(rs485Msg);       // получаем ошибку в этой строке
}

Пожалуйста, помогите... Спасибо

, 👍0


1 ответ


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

2

Вы не можете просто распечатать структуру. В конце концов, откуда программе знать, как она должна отображаться?

Вам нужны только необработанные данные или вы хотите, чтобы они были отформатированы в удобочитаемой форме?

Для необработанных данных вам необходимо привести указатель к типу, который можно напечатать в виде массива. Например:

Serial.write((uint8_t *)&rs485Msg, sizeof(struct rs485_message_t));

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

Serial.print("Checksum 0: ");
Serial.println(rs485Msg.CS0, HEX);

Еще один вариант — преобразовать структуру в класс и наследовать класс Printable. Затем вы можете реализовать функцию-член size_t printTo(Print &p);, которая отправляет данные в объект p для печати в нужном вам формате. Затем вы можете просто распечатать его напрямую, как вы пытаетесь сделать в своем коде.

,

Большое спасибо, это решило мою цель, @swanand