簡體   English   中英

C通過UART將結構發送到Python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM