необходимо получить значения из функции с аргументом указателя структуры и распечатать на последовательном терминале
Я разрабатываю код, в котором мне нужно напечатать значение указателя структуры на последовательном терминале. Ниже приведен мой фрагмент кода:
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); // получаем ошибку в этой строке
}
Пожалуйста, помогите... Спасибо
@swanand, 👍0
1 ответ
Лучший ответ:
Вы не можете просто распечатать структуру. В конце концов, откуда программе знать, как она должна отображаться?
Вам нужны только необработанные данные или вы хотите, чтобы они были отформатированы в удобочитаемой форме?
Для необработанных данных вам необходимо привести указатель к типу, который можно напечатать в виде массива. Например:
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
для печати в нужном вам формате. Затем вы можете просто распечатать его напрямую, как вы пытаетесь сделать в своем коде.
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Библиотека DHT.h не импортируется
- ошибка: ожидаемое первичное выражение перед токеном ','
Большое спасибо, это решило мою цель, @swanand