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…]部分的長度,它可能是從0到169之間的任何值。任何超出最大數的值都表明出現了錯誤(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指南裡給出。