簡體   English   中英

將浮點數作為字節從 Python 程序串行發送到 Arduino

[英]Sending floats as bytes over serial from Python program to Arduino

我正在嘗試通過串行連接從 Python 程序向 Arduino(使用 megaTinyCore 的 ATtiny1614)發送一個 uint8_t 和兩個浮點數作為字節(而不是數字中的實際字符)。 目前,在 Python 方面,我有這個:

Serial.write(b"\x01" + struct.pack("<ff", float1, float2))

在 Arduino 上,我有這個:

struct DATA_W {
  float f1;
  float f2;
} wStruct

if (Serial.available() >= (sizeof(uint8_t)+(sizeof(float)*2))) {
  uint8_t cmd = (uint8_t) Serial.read();
  Serial.readBytes((char *) &wStruct.f1, sizeof(float));
  Serial.readBytes((char *) &wStruct.f2, sizeof(float));
}

uint8_t 將在cmd變量中,兩個浮點數將在wStruct結構中。 我可以很好地讀取cmd ,但是當我讀取兩個浮點數時,我得到的值與我應該得到的值大不相同。 大多數時候,我只讀取 -0.00 和 0.00,但有時,我會得到非常大的數字。 一個例子是我發送 100 和 94.1999,但得到 -14336 和 20608(這些值是在我將浮點數轉換為 int 之后,但在轉換之前問題仍然出現)。

我做錯了什么,我該如何解決?

看來我的串口連接不可靠。 我在 Jetson Nano (/dev/ttyTHS1) 上使用內置連接。 當我切換到 USB 轉串口適配器時,代碼運行良好。

Arduino 端接收

 float serial_data;
 unsigned char serial_buffer[4];

 if (my_serial.readBytes(serial_buffer, sizeof(float)) == sizeof(float))
     memcpy(&serial_data, serial_buffer, sizeof(float));
 else
     // I/O error - Add error handler
     serial_data = 0

Python端接收

import struct

try:
    float_data = my_serial.read(4) # Refer IEEE 754
    serial_data = struct.unpack('f', float_data)
catch:
    # I/O Error, add error handler
    float_data = 0.0
  • 為了回寫,我們可以使用struct.pack
  • 建議盡可能使用精度更高的double而不是float

結構庫 Python IEEE 754 浮點數

另一種方法是使用現有的協議庫,如 Firmata(支持 Arduino、Python 和許多其他平台)來傳輸數據。 它會為您處理同步、編碼、解析和解碼,因此您不必擔心表示、打包、結束等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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