Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 107|回復: 2

有關Arduino 結構(struct)大小的問題

[複製鏈接]
發表於 2017-9-7 15:16:16 | 顯示全部樓層 |閱讀模式
各位前輩 大家好

目前使用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:42 | 顯示全部樓層
本帖最後由 超新手 於 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;
 樓主| 發表於 2017-9-8 09:02:12 | 顯示全部樓層
感謝 超新手幫忙

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

再次謝謝!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2017-10-17 08:12 , Processed in 0.114928 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表