python - C通过UART发送结构到Python

标签 python c++ serial-port pyserial esp32

我正在尝试通过 UART(从 ESP32)发送一个结构,以通过使用 this guide 由 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");
}

但是我收到错误:从'uint8_t* {aka unsigned char*}'到'const char*'的无效转换[-fpermissive]

我是 C++ 的新手,我尝试过各种类型的转换,但就是无法让它工作。有人可以提供指导吗?

最佳答案

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

你有两个主要错误:

// 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");

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

关于python - C通过UART发送结构到Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45765937/

相关文章:

Linux read() 系统调用花费的时间比我预期的要长(串口编程)

python - 使用 Pandas 清理 HTML 表格

python - 如何获取单个行的值?

c++ - Windows 上使用 C++ 的 google protobuf 时间戳未声明的标识符

c++ - 重载 << 运算符和递归

python - Windows 中的串行通信仿真

python - 我想在 blender 中导入 obj 文件

python - 为什么 ['hello' ] 是 ['hello' ] 在 Python 中返回 False?

c++ - 如何在 C++ 中调用 LsaRemoveAccountRights

c - 使用 C/C++ 在 Linux 中与终端交互