[英]C send struct over UART to 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 ++還是很陌生,我已經嘗試過各種類型的轉換,但是我無法使其正常工作。 有人可以提供指導嗎?
撇開將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");
順便說一句,修復了這兩個錯誤后,您可能會驚訝地發現結構不是您期望的字節數。 編譯器可以通過將字段填充到單詞大小的邊界(ESP32上為32位)來優化它,以使存儲器訪問更快。 sizeof()將返回正確的值,以考慮到所做的任何優化,但是您的Python代碼可能不會期望這樣做。 為了解決這個問題,您可能希望使用編譯器提示,例如__attribute__((__packed__))
。 有關結構包裝的一般指南,請參見此處 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.