Neurosky Think Gear Serial 資料格式探究(二)

    ThinkGear 數據包

    ThinkGear部件把數位資料作為非同步串列位元組流進行傳輸。串列資料流程必須作為ThinkGear資料包進行分析和解釋來合理提取和解析上述章節中講述的ThinkGear數據值。

    ThinkGear資料包是一個由3部分組成的資料包格式

    1.數據包標頭檔

    2.資料包的有效負載

    3.有效負載校檢和

    ThinkGear資料包用來把資料值在先前的章節裡有描述ThinkGear模組傳送到任意一台接收器(個人電腦、另一個微處理器或者可以接受串列位元組流的其他設備)。串列輸入輸出的應用程式設計發展介面在每個平臺作業系統和語言上都不同它不屬於本文的討論範圍 (參見平臺有關串列輸入/輸出程式設計的文)。本章僅涉及如何將串列位元組資料流程解讀到ThinkGear資料包有效負載後解讀到之前章節描述過的有用的資料值資料包格式要健壯和靈活組合在一起標頭檔和校檢位提供資料流程同步和資料完整的檢查而在不打破任何已有的應用程式或設備中的資料包解析器的情況下資料負載的格式保證了新的資料欄可以在以後加入進或存在的資料欄移動自資料包。這意味著任何一個正確執行ThinkGear資料流程解析器的應用程式都能使用新的ThinkGear模組並且無需改變它們的解析器和應用程式即使新ThinkGear硬體包括新的資料領域或重新排列了資料欄的順序。

     

    資料包結構

    資料包是以非同步的串列位元組流發送的。傳送媒介可以是通用非同步收發機UART),串列通訊埠serial COM,USB藍牙檔或者任何可以傳遞字節流的機械裝置。

    任何資料包都從標頭檔開始緊跟著資料負荷最後是負荷校檢和位元組如下

    [SYNC] [SYNC] [PLENGTH] [PAYLOAD...] [CHKSUM]

    ^^^^^^^^(Header)^^^^^^^  ^^(Payload)^^ ^(Checksum)^

    [PAYLOAD…]單元最多允許169個位元組而每個[SYNC] , [PLENGTH] , [CHKSUM]都是單字節。這意味著一個完整的、有效的資料包最少有4個位元組可能如果資料負載0位元組即空的最多有173如果資料負載可能有169位元組長長。

    正確解析ThinkGear資料包的流程請參考下面的逐步解析資料包指南。

    數據包的標頭檔(Data Header)

    資料包的標頭檔由3個位元組組成兩個同步[SYNC]位元組( 0xAA 0xAA )跟著一個[PLENGTH]有效負載長度位元組

    [SYNC] [SYNC] [PLENGTH]

    ^^^^^^^^(Header)^^^^^^^

    兩個[SYNC]位元組常常用來標識一個新的資料包的開始位元組的值是0xAA進制170。同步是兩個位元組的長度這是為了避免在資料包內將[SYNC] (0xAA)位元組誤認為資料包的開始。雖然兩個連續的[SYNC]位元組仍然有可能出現在一個數據包裡,(導致分析器試圖開始以資料包的起點解析資料包的中部),[PLENGTH][CHKSUM]相結合確保了“missync'資料包不會被誤解為合法的資料包欲了解更詳細的資訊請見下面的負載校驗和)[PLENGTH]位元組以位元組的形式表明資料包的資料負載[PAYLOAD…]部分的長它可能是從0169之間的任何值。任何超出最大數的值都表明出現了錯誤PLENGTH 太大。請注意 [PLENGTH]是資料包負載的長度而不是整個資料包的長度。完整的資料包的長度一般是[PLENGTH] + 4

    資料負載(Data Payload)

    資料包的資料負載僅僅是一系列的位元組。資料包裡資料負載位元組的數目來自于資料包標頭檔裡的[PLENGTH]位元組。第一章已經描述過將資料負載位元組解讀ThinkGear資料值下面的資料負載結構章節將會更詳細地對其進行定義。注意要在確認檢測位元位元組之後再嘗試解析資料負載詳情請見以下章節。

    負載校驗和(Checksum)

    [CHKSUM]位元組必須用來確認資料包的資料負載的完整性。負載檢測位元的定義如下

    1.對資料包的資料負載的所有位元組進行相加

    2.採取總和的最低的8

    3.對最低8位執行位相反數編譯相反

    接收資料包的接收器必須使用上述三個步驟來計算他們收到的資料負載的校驗和然後與一起接收到的[CHKSUM]校驗和位元組進行比較。如果計算的負載校驗和和接受到的[CHKSUM]值不匹配則整個資料包也是無效的應該捨棄。如果他們互相匹配接收器會按下面資料負載結構章節描述的那樣來優先解析資料負載。

    資料負載結構

    一旦驗證了資料包的校驗和就可以解析資料有效負載的位元組了。資料有效負載由一系列連續的資料值組成每個資料組包含在一個稱為DataRow的連續字節裡。每個DataRow包含關於資料值代表什麼資料值的長度,以及資料值的位元組的信息。所以要解析資料負載必須從資料負載中解析每個DataRow直到解析完所有資料負載的位元組。

    DataRow格式

    一個DataRow包含以下格式的位元組

    ([EXCODE]...) [CODE] ([VLENGTH]) [VALUE...]

    ^^^^(Value Type)^^^^ ^^(length)^^ ^^(value)^^

    括弧內的位元組是有條件的也就是他們只出現在一些DataRows中。詳情如下:

    DataRow可能以0或者[EXCODE] 擴展碼位元組開始這些位元組的值是0x55 [EXCODE]位元組數量表示擴展碼等級。擴展碼等級反過來與[CODE]位元組一起決定DataRow包含的資料類型。因此解析器應該總是通過計算決定DataRow's [CODE]擴展碼等級[EXCODE] ( 0x55 )的位元組數從而開始解析DataRow

    [CODE]位元組與擴展碼等級一道可以顯示出編碼在DataRow裡的資料數值型別。例如在擴展碼等級為0 0x04[CODE]表明DataRow中包含有eSense專注度指數。下面CODE定義表格列有已經定義過的[CODE]意義。注意0x55 [EXCODE]位元組不能作為 [CODE] 使用 (而且0xAA [SYNC]位元組也不能作為一個 [CODE]來使用)

    如果[CODE] 位元組在0x00 0x7F之間[VALUE…]將預設為1位元組長 (之為單字節的值)。在這種情況下沒有[VLENGTH]位元組所以單個[VALUE] 位元組將出現在[CODE]位元組之後。

    如果[CODE]大於0x7F[VLENGTH]值的長度位元組將立即跟在[CODE]位元組後這是[VALUE…]中位元組的數量稱之為多位元組值。這些更高的CODEs可以用來傳送值陣列或與單字節不符的值。

    這樣定義DataRow格式是為了將來在增加新的表示任意長DATA...CODE(他們簡單地忽略了識別不出的CODEs而沒有中斷解析)CODEs的命令被重新整理在資料包中或一些CODEs沒有在每一個資料包中進行傳遞時任何正確應用的解析器都不會中斷。

    正確解析資料包和DataRows的步驟分別在下面的逐步解析資料包指南和逐步解析資料包負載裡的DataRows指南裡給出。

    天火資訊工作室

    地址:新北市中和區泰和街38巷30號

    電話:(02)2242-6409