C 通过 UART 发送结构到 Python
C send struct over UART to Python
我正在尝试通过 UART(从 ESP32)发送一个结构,以便 Python 使用 this guide 进行处理。
// 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++ 的新手,我尝试过各种类型的转换,但就是无法让它工作。有人可以提供指导吗?
抛开混合 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");
顺便说一句,在修复这 2 个错误后,您可能会惊讶地发现您的结构不是您期望的字节数。编译器可以优化它,通过将字段填充到字大小的边界(ESP32 上为 32 位)来加快内存访问速度。 sizeof() 将 return 考虑到已完成的任何优化的正确值,但您的 Python 代码可能不会期望如此。要解决此问题,您可能需要使用编译器提示,例如__attribute__((__packed__))
。有关结构打包的一般指南,请参阅 here。
我正在尝试通过 UART(从 ESP32)发送一个结构,以便 Python 使用 this guide 进行处理。
// 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++ 的新手,我尝试过各种类型的转换,但就是无法让它工作。有人可以提供指导吗?
抛开混合 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");
顺便说一句,在修复这 2 个错误后,您可能会惊讶地发现您的结构不是您期望的字节数。编译器可以优化它,通过将字段填充到字大小的边界(ESP32 上为 32 位)来加快内存访问速度。 sizeof() 将 return 考虑到已完成的任何优化的正确值,但您的 Python 代码可能不会期望如此。要解决此问题,您可能需要使用编译器提示,例如__attribute__((__packed__))
。有关结构打包的一般指南,请参阅 here。