Robofun 機器人論壇

標題: 有關Arduino 結構(struct)大小的問題 [打印本頁]

作者: adolclistin    時間: 2017-9-7 15:16
標題: 有關Arduino 結構(struct)大小的問題
各位前輩 大家好

目前使用Arduino ethernet shield 與電腦互傳資料,其中以是tcp的通訊協定來傳送結構(struct)

其中結構如下:

typedef unsigned char uchar;

#pragma pack(1)

typedef struct Motorinfo{
    uchar structure_start;
    uchar MotorNo;
    int rpm;
    int deg;
    bool dir;
    uchar structure_end;
}Motorinfo;

#pragma pack()

對齊方式是以一個byte進行對齊

在電腦裡顯示此結構大小是12byte
但是在arduino 的程式裡只顯示出此結構大小是8byte

所以資料傳過來後,最後一個成員structure_end沒有值,deg和dir這兩個成員的數值是錯的。

且我也測試過,電腦傳電腦是沒有問題。初步可以排除電腦傳送的錯誤問題。

想請教在Arduino裡的struct是否有什麼跟一般電腦裡的c++不同,或是需要注意的。
先謝過各位前輩。




作者: 超新手    時間: 2017-9-7 16:56
本帖最後由 超新手 於 2017-9-7 17:03 編輯

int 的長度定義和 MCU 的種類有關
而不是固定的
所以, 比較簡單的做法
就是直接指定大小即可
也就是把 int 改成 int32_t
typedef struct Motorinfo{
    uchar structure_start;
    uchar MotorNo;
    int32_t rpm;
    int32_t deg;
    bool dir;
    uchar structure_end;
}Motorinfo;
其實不管在 PC 端或 Arduino 都可以直接這樣定義
PC 端有可能需要 #include <stdint.h>
而最好的寫法應該是
typedef struct Motorinfo{
    uint8_t structure_start;
    uint8_t MotorNo;
    int32_t rpm;
    int32_t deg;
    uint8_t dir;
    uint8_t structure_end;
}Motorinfo;

作者: adolclistin    時間: 2017-9-8 09:02
感謝 超新手幫忙

經過測試後,真的是這個問題,所以我把電腦端的變數也都改為您的建議。
再樣做之後,arduino 所接收到的資料就沒有問題了。

再次謝謝!




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2