0

我正在尝试使用本指南通过 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++ 很陌生,我尝试了各种类型的转换,但我就是无法让它工作。有人可以提供指导吗?

4

1 回答 1

1

撇开混合 ASCII 和原始二进制文件通常是个坏主意不谈,您的代码几乎是正确的。

您有两个主要错误:

// instantiate struct
package to_send = {};

应该:

// instantiate struct
struct package to_send = {};

此外,要直接写入(非格式化文本)到 STDOUT,您想使用fwrite()

IE

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

顺便说一句,在修复这两个错误之后,您可能会惊讶地发现您的结构不是您期望的字节数。编译器可以通过将字段填充到字大小的边界(ESP32 上的 32 位)对其进行优化,以加快内存访问速度。sizeof() 将返回正确的值,考虑到所做的任何优化,但您的 Python 代码可能不会这样。要解决此问题,您可能需要使用编译器提示,例如__attribute__((__packed__)). 请参阅此处了解结构填充的一般指南。

于 2017-12-10T09:39:28.747 回答