Mifare RFID-RC522模組實驗(二):C語言的結構(struct)與類型定義(typedef)說明

本單元的程式將在Arduino中紀錄一些Mifare標籤的識別碼,並且替它們標示名稱。每當掃描到這些標籤,Arduino就在序列埠監控視窗顯示它的名稱。識別碼可以用16進位、10進位…等格式表示。

Mifare標籤

認識C語言的結構(Struct)

C語言的陣列所儲存資料必須是相同的類型。如果要儲存一組包含不同類型的資料,可以使用結構(struct)

比較陣列(array)與結構(struct)

定義結構相當於規劃容器的「藍圖」。下圖右是定義儲存一個位元組陣列和一個字串的結構,結構裡的每一個資料欄位,稱為一個「成員」。

結構定義的語法

結構定義完畢後,就可以填入資料,這個步驟稱為「初始化結構資料」。下圖右的程式將利用RFIDTag這個「藍圖」,打造一個叫做“tag”的容器,並在其中填入UID識別碼和自訂的名稱。

初始化結構資料

存取結構裡的成員的語法如下,底下的敘述將取出tag裡的name資料:

取出結構資料

若要儲存一組結構資料,請使用陣列,底下的敘述將在tags陣列中儲存三組標籤的識別碼和名稱:

顯示Mifare標籤名稱的Arduino程式

本實驗單元的材料和電路,與前一篇貼文相同。完整的程式碼如下:

第18行的sizeof()將傳回結構和陣列資料佔用的位元組大小,此程式的陣列佔用18位元組,結構佔用6位元組,兩者相除之後存入totalTags,因此其值為3,代表一共有3個標籤元素。

第39行透過memcmp()函式比對陣列,相關語法和範例說明,請參閱《超圖解Arduino互動設計入門》18-16頁。

上傳程式碼之後,掃描Mifare標籤,Arduino的序列埠監控視窗將顯示類似下圖的結果:

序列埠監控視窗

使用typedef指令自訂資料類型

typedef指令能將現有的資料類型改成自訂的名稱,通常用於簡化類型名稱,語法如下:

我們可以把結構定義帶入typedef指令,如此,初始化結構資料時,就不用加上struct關鍵字:

使用typedef自訂結構資料類型

因此,上一節程式當中的結構定義和初始化語法,可改寫成:

其餘程式碼都一樣。

未完,待續…

延伸閱讀

7 thoughts on “Mifare RFID-RC522模組實驗(二):C語言的結構(struct)與類型定義(typedef)說明

    1. 如同「Mifare RFID-RC522模組實驗(一)」這篇貼文提到的,Mifare卡片有不同的系列,有沒有可能你的卡片不是Mifare Classic?如果你有具備NFC功能的Android手機,可以下載NFC reader之類的工具軟體,讀取Mifare卡片的資訊(如:系列類型)確認一下。

      thanks,
      jeffrey

  1. 老師我的用手機掃描出來是classic
    ID(hex):72 bb 3a dc
    ID(reversed hex):dc 3a bb 72
    ID(dec):1924872924
    ID(reversed dec):3694836594
    Mifare Classic type:classic
    老師我想請問一下這些代表甚麼意思,我是用一卡通掃描出來的

    1. 就是你的卡片的唯一識別碼(ID),十進位(dec)和16進位(hex),以及卡片類型(MiFare Classic)。

      thanks,
      jeffrey

  2. 老師我想請教您
    假如我想把唯一辨識碼放到RFID(三)的程式中請問要宣告區段編號是第幾個
    謝謝老師
    祝老師有個美好的一天

    1. 就是說假如不是上面的那段唯一辨識碼的話就會顯示wrong的意思
      謝謝老師
      祝老師有個美好的一天

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *