C отправить структуру через UART в Python

Я пытаюсь отправить структуру через UART (из ESP32) для обработки Python с помощью это руководство.

// we send this to the host, to be processed by python script
struct package {
uint8_t modifier;
uint8_t keyboard_keys[6];
};

// instantiate struct
package to_send = {};

// send the contents of keyboard_keys and keyboard_modifier_keys
// https://folk.uio.no/jeanra/Microelectronics/TransmitStructArduinoPython.html
void usb_keyboard_send(void)
{

to_send.modifier = keyboard_modifier_keys;
for(uint8_t i = 0; i < 6; i++) {
to_send.keyboard_keys[i] = keyboard_keys[i];
}

printf("S");
printf((uint8_t *)&to_send, sizeof(to_send));
printf("E");
}

Однако я получаю ошибку: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'const char*' [-fpermissive]

Я довольно новичок в C ++, и я пробовал все виды кастинга, но я просто не могу заставить его работать. Может ли кто-нибудь предложить руководство, пожалуйста?

0

Решение

Если оставить в стороне, что вообще плохая идея смешивать ASCII и необработанный двоичный код, ваш код почти право.

У вас есть 2 основные ошибки:

// instantiate struct
package to_send = {};

должно быть:

// instantiate struct
struct package to_send = {};

Кроме того, чтобы написать напрямую (не отформатированный текст) в STDOUT, который вы хотите использовать FWRITE ()

то есть

printf("S");
fwrite((uint8_t *)&to_send, sizeof(uint8_t), sizeof(struct_package), STDOUT);
printf("E");

Кроме того, после исправления этих двух ошибок вы можете быть удивлены, обнаружив, что ваша структура не соответствует ожидаемому числу байтов. Компилятор может оптимизировать его, чтобы ускорить доступ к памяти, дополнив поля до границ размера слова (32 бита в ESP32). sizeof () вернёт правильное значение, принимая во внимание все выполненные оптимизации, но ваш код Python может этого не ожидать. Чтобы это исправить, вы, вероятно, захотите использовать подсказку компилятора, например, __attribute__((__packed__)), Увидеть Вот для общего руководства по структуре упаковки.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector