LEGO EV3 通訊 開發者套件
LEGO MINDSTORMS EV3 可程式設計 brick 是新 LEGO MINDSTORMS 平臺內的中央處理單元。可程式設計 brick 由各種先進的電子裝置組成,以實現其廣泛的功能。
下面的列表是 EV3 可程式設計 brick 硬體規格總結。
硬體 | 規格 |
---|---|
主處理器 | 32-bit ARM9 processor, Texas Instrument AM1808 - 300 MHz - OS: LINUX |
儲存器 | 64 MB DDR RAM 16 MB FLASH 256 KB EEPROM |
Micro SD卡介面 | SDHC standard, 2 – 32 GB |
Bluetooth 無線通訊 | Bluetooth V2.1 EDR, Panasonic PAN1325 模組 - Texas Instrument CC2550 晶片 - BlueZ Bluetooth 棧 - Primary usage, Serial Port Profile (SPP) |
USB 2.0 通訊,客戶端介面 | 高速埠 (480 MBit/s) |
USB 1.1 通訊,客戶端介面 | 全速埠 (12 MBit/s) |
4 個輸入埠 | 6 個介面同時支援數字和模擬介面 - 模擬輸入 0 – 5 V - 支援 Auto-ID 擴充套件裝置 - UART 通訊 Up to 460 Kbit/s (Port 1 and 2) Up to 230 Kbit/s (Port 3 and 4) |
4 個輸出埠 | 6 個有線介面,支援電機編碼器輸入 |
顯示 | 178x128 畫素黑白點陣顯示器 - 可視區域: 29.9 x 41.1 mm |
擴音器 | 直徑,23 mm |
6 個按鈕使用者介面 | 環繞 UI 燈 |
電源 | 6 AA 電池 - 建議使用鹼性電池 - 可充電鋰離子電池,2000 mAH |
連結器 | 6 線工業標準聯結器,RJ-12右側調節 |
2 通訊介面
這部分將描述不同型別 masters(主機)與 LEGO MINDSTORMS EV3 brick 通訊所用的協議。EV3 支援多種通訊介面 Bluetooth,USB 和 WiFi。EV3 協議對於所有 3 種傳輸技術都是相同的。
除了執行使用者程式外,VM(虛擬機器)還能執行通過上述技術之一發送的直接命令。直接命令由構成常規位元組碼的小程式組成,有關各位元組碼的更多詳細資訊,請參考 LEGO MINDSTORMS EV3 韌體開發者套件 。這些直接命令(程式碼片段)與執行的使用者程式並行執行。
在組合這些直接命令時要特別小心。在使用危險的程式碼和結構時沒有任何限制(例如,允許直接命令中出現死鎖迴圈)。然而 “普通的” 執行中的程式將繼續正常工作 - 只有 VM 的直接命令部分將被這樣的死鎖迴圈 “鎖死”。
由於頭部只為變數分配包含 2 個位元組,直接命令僅限於一個 VMTHREAD - 即SUBCALLs 和 BLOCKs 當然是不可能的。
具有資料響應的直接命令可以把返回資料放在全域性變數空間中。全域性變數空間 “等於” 通訊響應緩衝區。直接命令的組成定義了放置結果的偏移量位置(全域性變數 0 放在返回緩衝區中偏移量為 0 的位置)。
響應緩衝區(全域性變數)中的偏移量必須對齊(第一個對齊到 float/32 位,最後一個對齊到 8 位)。
除了直接命令,EV3 還支援系統命令,這是更通用的術語命令,它們被用於向/從嵌入式 EV3 系統下載和上傳資料。
3 系統命令
#defineSYSTEM_COMMAND_REPLY 0x01// 系統命令,需要應答 #defineSYSTEM_COMMAND_NO_REPLY 0x81// 系統命令,無需應答
系統命令位元組:
位元組 0 - 1:命令大小,小尾端。命令大小不包含這 2 個位元組
位元組 2 - 3:訊息計數器,小尾端。Forth running counter
位元組 4:命令型別。參考上面的定義
位元組 5:系統命令。參考下面的定義
位元組 6 - n:依賴於位元組 5 中給出的系統命令
系統命令:
#defineBEGIN_DOWNLOAD 0x92// 開始檔案下載 #defineCONTINUE_DOWNLOAD 0x93// 繼續檔案下載 #defineBEGIN_UPLOAD 0x94// 開始檔案上傳 #defineCONTINUE_UPLOAD 0x95// 繼續檔案上傳 #defineBEGIN_GETFILE 0x96// 開始從檔案獲取位元組(在寫入檔案時) #defineCONTINUE_GETFILE 0x97// 繼續從檔案獲取位元組(在寫入檔案時) #defineCLOSE_FILEHANDLE 0x98// 關閉檔案控制代碼 #defineLIST_FILES 0x99// 列出檔案 #defineCONTINUE_LIST_FILES 0x9A// 繼續列出檔案 #defineCREATE_DIR 0x9B// 建立目錄 #defineDELETE_FILE 0x9C// 刪除 #defineLIST_OPEN_HANDLES 0x9D// 列出控制代碼 #defineWRITEMAILBOX 0x9E// 寫郵箱 #defineBLUETOOTHPIN 0x9F// 把可信的 pin 碼傳入 brick #defineENTERFWUPDATE 0xA0// 重啟 brick 進入 Firmware 更新模式
3.1 系統命令應答
#defineSYSTEM_REPLY 0x03// 系統命令應答 OK #defineSYSTEM_REPLY_ERROR 0x05// 系統命令應答 ERROR
系統應答位元組:
位元組 0 - 1:應答大小,小尾端。應答大小不包含這 2 個位元組
位元組 2 - 3:訊息計數器,小尾端。等於直接命令
位元組 4:應答型別。參考上面的定義
位元組 5:這個應答響應的系統命令
位元組 6:系統應答狀態 - 錯誤,資訊或成功。參考下面的定義
位元組 7 - n:進一步的系統應答位元組依賴於系統命令和系統應答狀態
系統命令應答狀態碼:
#defineSUCCESS 0x00 #defineUNKNOWN_HANDLE 0x01 #defineHANDLE_NOT_READY 0x02 #defineCORRUPT_FILE 0x03 #defineNO_HANDLES_AVAILABLE 0x04 #defineNO_PERMISSION 0x05 #defineILLEGAL_PATH 0x06 #defineFILE_EXITS 0x07 #defineEND_OF_FILE 0x08 #defineSIZE_ERROR 0x09 #defineUNKNOWN_ERROR 0x0A #defineILLEGAL_FILENAME 0x0B #defineILLEGAL_CONNECTION 0x0C
3.2 向 EV3 可程式設計 brick 下載資料
下載大檔案可能非常耗時,因此檔案下載可以以 2 種不同的方式完成。
-
以最大可能塊下載檔案,即儘可能使用最大的資料包大小(總命令大小不包括在內。 Length 位元組= 65534位元組)。如果總訊息大小可以保持在 65534 位元組以下,則所有的資料可以放進 開始下載 命令,這將是下載檔案最快的方式。這是最快的下載方式,但在這段時間內系統也會被鎖定。
-
把檔案下載分為更小的部分,即一個 開始下載 後面跟著大量的 繼續下載 命令,這將增加總的下載時間,但在持續的 繼續下載 命令交錯間也將給其它命令(更高優先順序的)留下空間(時間片)。
這是下載檔案最慢的方式,但可以在 繼續下載 訊息間交錯其他命令。
由於包中沒有停止或其它同步位元組 - 一個訊息一定不能被其它訊息打斷。即當 brick 已經接收了命令大小(訊息的頭 2 個位元組)時,所有剩餘的位元組必須無中斷地被傳送和接收。這個特定訊息的應答(來自於 brick)也應該在任何新訊息被髮送和由 brick 處理前被傳送和接收。
下面的例子基於想要給 P-Brick 傳送一個檔案的主機應用(X3 software)構建:
命令大小,命令型別,開始 D/L,檔案大小,檔名 ——>
<—— 命令大小,命令型別,控制代碼
命令大小,命令型別,繼續 D/L,控制代碼,載荷 ——>
<—— 命令大小,命令型別
命令大小,命令型別,繼續 D/L,控制代碼,載荷 ——>
<—— 命令大小,命令型別
命令大小,命令型別,繼續 D/L,控制代碼,載荷 ——>
3.2.1 檔案下載
- 目的檔名路徑相對於 “lms2012/sys” 定位
- 目的目錄自動從檔名路徑建立
- 第一個目錄名必須是: “apps” , “prjs” 或 “tools” (參考 \ref UIdesign)
- 檔名路徑中的第二個資料夾名稱必須等於位元組碼可執行名稱
3.2.2 檔案上傳(檔案讀取)
- BEGIN_UPLOAD 和 CONTINUE_UPLOAD 在檔案上傳結束時自動關閉檔案控制代碼。
- BEGIN_GETFILE 和 CONTINUE_GETFILE 當到達 EOF 時不關閉檔案控制代碼
- CONTINUE_GETFILE 也返回完整的檔案大小
3.2.3 目錄上傳
- LIST_FILES 只要列表不超過 1014 位元組,就可以工作。
3.3 系統命令,通訊例子
在下文中,系統命令通訊示例的例子將幫助說明介面。
3.3.1 檔案下載
下載檔案 “../apps/tst/tst.rbf”
BEGIN_DOWNLOAD:
向 brick 傳送的位元組:
1C00xxxx0192xxxxxxxx2E2E2F617070732F7473742F7473742E72626600 (Hex)
bbbbmmmmttssllllllllnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
bbbb = 訊息中的位元組數
mm = 訊息計數器
tt = 命令型別
ss = 系統命令
llllllll = 檔案長度
nn.. = 以 0 結束的檔名
從 brick 接收的位元組:
0600xxxx03920000 (Hex)
bbbbmmmmttssrrhh
bbbb = 訊息中的位元組數
mm = 訊息計數器
tt = 命令型別
ss = 系統命令
rr = 返回狀態
hh = 檔案控制代碼
CONTINUE_DOWNLOAD:
向 brick 傳送的位元組:
xxxxxxxx819300xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (Hex)
bbbbmmmmttsshhpppppppppppppppppppppppppppppppppppppppp
bbbb = 訊息中的位元組數
mm = 訊息計數器
tt = 命令型別
ss = 系統命令
hh = 檔案控制代碼(在 BEGIN_DOWNLOAD 中返回)
pp.. = 載荷
從 brick 接收的位元組:
0600xxxx03930000 (Hex)
bbbbmmmmttssrrhh
bbbb = 訊息中的位元組數
mm = 訊息計數器
tt = 命令型別
ss = 系統命令
rr = 返回狀態
hh = 檔案控制代碼
3.3.2 檔案上傳
BEGIN_UPLOAD:
向 brick 傳送的位元組:
xxxxxxxx0194xxxxxxx
bbbbmmmmttssllllnnn…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
llll = 要讀取的位元組
nnn… = 檔名,包含路徑
從 brick 接收的位元組:
xxxxxxxx039400xxxxxxxx00xxx
bbbbmmmmttssrrllllllllhhppp…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
rr = 返回狀態
llllllll = 檔案大小
hh = 檔案控制代碼
ppp… = 載荷
CONTINUE_UPLOAD:
向 brick 傳送的位元組:
0700xxxx019500xxxx
bbbbmmmmttsshhllll…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
hh = 檔案控制代碼
llll = 要讀取的位元組
向 PC 傳送的位元組:
xxxxxxxx03950000xxx
bbbbmmmmttssrrhhppp…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
rr = 返回狀態
hh = 控制代碼
pppp.. = 載荷
3.3.3 獲取檔案內容
用於上傳資料記錄檔案 - 檔案控制代碼只在檔案指標到達 EOF 時關閉,且檔案不以寫模式開啟。
BEGIN_GETFILE:
向 brick 傳送的位元組:
xxxxxxxx0196xxxxxxx
bbbbmmmmttssllllnnn…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
llll = 最大讀取位元組數
nnnn…. = 路徑
向 PC 傳送的位元組:
xxxxxxxx039600xxxxxxxx00xxx
bbbbmmmmttssrrllllllllhhppp…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
rr = 返回狀態
llllllll = 檔案大小
hh = 控制代碼
ppp… = 載荷
CONTINUE_GETFILE:
向 brick 傳送的位元組:
0700xxxx019700xxxx
bbbbmmmmttsshhllll
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
hh = 控制代碼
llll = 最大讀取位元組數
向 PC 傳送的位元組:
xxxxxxxx039700xxxxxxxx00xxx
bbbbmmmmttssrrllllllllhhppp…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
rr = 返回狀態
llllllll = 檔案大小
hh = 控制代碼
ppp… = 載荷
3.3.4 列出檔案和目錄
LIST_FILES:
新行分隔列表的格式為:
如果是檔案:
MD5SUM 的 32 chars (hex) + space + 8 chars (hex) 的檔案大小 + space + 檔名 + 新行
如果是目錄:
目錄名 + / + 新行
向 brick 傳送的位元組:
xxxxxxxx0199xxxxxxx
bbbbmmmmttssllllnnn…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
llll = 最大讀取位元組數
nnn…. = 路徑名
向 PC 傳送的位元組:
xxxxxxxx0399xxxxxxxxxxxxxxx
bbbbmmmmttssrrllllllllhhnnn…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
rr = 返回狀態
llllllll = 列表大小
hh = 控制代碼
nnn.. = 新行分隔列表
CONTINUE_LIST_FILES:
向 brick 傳送的位元組:
0700xxxx019Axxxxxx
bbbbmmmmttsshhllll
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
hh = 控制代碼
llll = 最大讀取位元組數
向 PC 傳送的位元組:
xxxxxxxx039Axxxxxxx
bbbbmmmmttssrrhhppp…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 命令型別
ss = 系統命令
rr = 返回狀態
hh = 控制代碼
ppp… = 載荷
3.3.5 關閉檔案控制代碼
CLOSE_FILEHANDLE:
向 brick 傳送的位元組:
xxxxxxxx019800xxxxxxxxxxxxxxxx
bbbbmmmmttsshhpppppppppppppppp
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
hh = 控制代碼
ppp… = 雜湊
向 PC 傳送的位元組:
0500xxxx039800
bbbbmmmmttssrr
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
rr = 返回狀態
3.3.6 建立目錄
CREATE_DIR:
向 brick 傳送的位元組:
xxxxxxxx019Bxxxxxx…
bbbbmmmmttsspppppp…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
pp = 以 null 結尾的字串,其中包含了要建立的目錄的完整路徑
向 PC 傳送的位元組:
0500xxxx039Bxx
bbbbmmmmttssrr
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
rr = 返回狀態
3.3.7 刪除一個檔案
DELETE_FILE:
向 brick 傳送的位元組:
xxxxxxxx019Cxxxxxx…
bbbbmmmmttsspppppp…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
pp = 以 null 結尾的字串,其中包含了要刪除的檔案的完整路徑
向 PC 傳送的位元組:
0500xxxx039Cxx
bbbbmmmmttssrr
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
rr = 返回狀態
3.3.8 獲取開啟控制代碼的列表
LIST_OPEN_HANDLES:
向 brick 傳送的位元組:
xxxxxxxx019D
bbbbmmmmttss
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
向 PC 傳送的位元組:
xxxxxxxx039Dxxxxxx….
bbbbmmmmttssrrpppp….
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
rr = 返回狀態
pppp = 用於指示控制代碼是否處於 busy 狀態的位
3.3.9 寫郵箱
WRITEMAILBOX:
向另一個 brick 傳送的位元組:
郵箱名稱必須以 0 結尾,同時名稱長度必須是剔除結尾的 0 的字元數!
xxxxxxxx819Exxxxxxxxxxxxxxxxxxxx
bbbbmmmmttssllaaaaa…LLLLppp…
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
ll = 名稱長度
aaa… = 名稱
LLLL = 載荷長度
ppp… = 載荷
從另一個 brick 接收的應答:
無效
3.3.10 設定 Bluetooth PIN 碼
BLUETOOTHPIN:
出於安全的原因,這個命令只能通過 USB 傳送,且應該被格式化為:
Bluetooth 地址一定不能包含冒號
Bluetooth MAC 地址是 0 結尾的字串型別* Bluetooth pin 碼是 0 結尾的字串型別
向 brick 傳送的位元組:
0E00xxxx019F06xxxxxxxxxxxx04xxxx
bbbbmmmmttssllaaaaaaaaaaaaLLpppp
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
ll = MAC 長度
aaa… = PC 的 MAC 地址
LL = pin 長度
ppp… = pin 碼
向 PC 傳送的位元組:
0F00xxxx039Fxx06xxxxxxxxxxxx04xxxx
bbbbmmmmttssrrllaaaaaaaaaaaaLLpppp
bbbb = 訊息中的位元組
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
rr = 返回狀態
ll = MAC 長度
aaa… = PC 的 MAC 地址
LL = pin 長度
ppp… = pin 碼
3.3.11 強制 EV3 可程式設計 brick 進入 Firmware 升級模式
這個命令用於強制 brick 進入 Firmware 升級模式。這個命令將不傳送任何響應回主機。關閉(關機)Linux OS 時,不會更新檔案系統。
ENTERFWUPDATE:
向 brick 傳送的位元組:
0400xxxx81A0
bbbbmmmmttss
bbbb = 訊息中的位元組數
mmmm = 訊息計數器
tt = 訊息型別
ss = 系統命令
4. 直接命令
#defineDIRECT_COMMAND_REPLY 0x00// 直接命令,需要應答 #defineDIRECT_COMMAND_NO_REPLY 0x80// 直接命令,無需應答
直接命令位元組:
位元組 0 - 1:命令大小,小尾端。命令大小不包含這 2 個位元組
位元組 2 - 3:訊息計數器,小尾端。Forth running counter
位元組 4:命令型別。參考上面的定義
位元組 5 - 6:使用壓縮格式保留(分配)全域性變數和區域性變數(在位元組 5 和位元組 6 的 2 個 lsb 中保留全域性變數,在位元組 6 的高 6 位中保留本地變數) - 見下文:
位元組 7 - n:單個命令或複合命令的位元組程式碼(即多個命令組合為一個小程式)
區域性的 = “l”, 全域性的 = “g”
Byte6: Byte5: 位號:76543210 76543210 變數大小:llllllgggggggggg
gg gggggggg全域性變數保留 0 – (2^10 – 1) 0..1023 位元組
llllllxx區域性變數保留 0 – (2^6 – 1) 0….63 位元組
4.1 直接應答
#defineDIRECT_REPLY 0x02// 直接命令應答 OK #defineDIRECT_REPLY_ERROR 0x04// 直接命令應答 ERROR
直接應答位元組:
位元組 0 - 1:應答大小,小尾端。應答大小不包含這 2 個位元組
位元組 2 - 3:訊息計數器,小尾端。與直接命令相同
位元組 4:應答型別。參考上面的定義
位元組 5 - n:響應緩衝區,即命令為全域性變數保留的位元組內容。即如果命令保留 64 位元組,這些位元組將被放在應答包的位元組 5 到 68。
4.2 直接命令,通訊示例
下面的直接命令通訊的例子將幫助更詳細地說明介面。使用的高層的巨集說明如下。
更高層的引數編碼:
為了使使用引數編碼更簡單,而使用了 “bytecodes.h” 中定義的一些巨集(關於引數編碼也可以參考 “LEGO MINDSTORMS EV3 - Firmware Developer Kit” 文件中第 9 頁 - 3.4 引數編碼 ),所示的範圍被編碼為有符號數。
LCS | Long variable type | Length bytes | STRING zero terminated |
---|---|---|---|
LC0(v) | Short constant(value) | single byte | +/- 31 |
LC1(v) | Long constant(value) | one byte to follow (2 bytes) | +/- 127 |
LC2(v) | Long constant(value) | two bytes to follow (3 bytes) | +/- 32767 |
LC4(v) | Long constant(value) | four bytes to follow (5 bytes) | +/- 2147483647 |
LV0(i) | Short LOCAL variable(adr) | single byte at adr | +/- 31 |
LV1(i) | Long LOCAL variable(adr) | one byte to follow at adr (2 bytes) | +/- 127 |
LV2(i) | Long LOCAL variable(adr) | two bytes to follow at adr (3 bytes) | +/- 32767 |
LV4(i) | Long LOCAL variable(adr) | four bytes to follow at adr (5 bytes) | +/- 2147483647 |
GV0(i) | Short GLOBAL variable(adr) | single byte at adr | +/- 31 |
GV0(i) | Long GLOBAL variable(adr) | one byte to follow at adr (2 bytes) | +/- 127 |
GV0(i) | Long GLOBAL variable(adr) | two bytes to follow at adr (3 bytes) | +/- 32767 |
GV0(i) | Long GLOBAL variable(adr) | four bytes to follow at adr (5 bytes) | +/- 2147483647 |
4.2.1 在 EV3 brick 上啟動程式 “Demo”
載入並執行一個應用位元組碼檔案。這個示例也展示了複合的直接命令 - 即在一個單獨的包中的兩個或更多直接命令。這裡我們載入位元組碼映象: “../prjs/BrkProg_SAVE/Demo.rpf” 進 slot 1 - 使用者 slot。後面緊接著是啟動slot 1 中的程式的命令。記住這是一個組合命令,且不能交錯。 備註: 副檔名是 “rpf” 而 不是 “rbf”。檔案是內建的 “on-brick program file”。
向 brick 傳送的位元組:
opFILE,LC0(LOAD_IMAGE),LC2(USER SLOT),LCS,’.’,’.’,’/‘,’p’,’r’,’j’,’s’,’/‘,
‘B’,’r’,’k’,’P’,’r’,’o’,’g’,
‘ ‘,’S’,’A’,’V’,’E’/‘,’D’,’e’,’m’,’o’,’.’,’r’,’p’,’f’,0,GV0(0),GV0(4),opPROGRAM_START,
LC0(USER_SLOT),GV0(0),GV0(4),LC0(0)
指令 | 說明 |
---|---|
opFILE | 檔案有關的操作碼 |
LC0(LOAD_IMAGE) | 命令被編碼為單位元組常數 |
LC2(USER_SLOT) | 使用者 slot(1 = 程式 slot)被編碼為單個常量位元組 |
LCS | 編碼:後面是字串(以 0 結尾) |
“../prjs/BrkProg_SAVE/Demo.rpf” | 檔案路徑和名稱。“..” 是 “從當前目錄移到上一級目錄” |
0x00 | 上面的字串的結尾 0 |
GV0(0) | 在全域性變數偏移 0 處返回映象大小。偏移量被編碼為單個位元組。 |
GV0(4) | 在全域性變數偏移 4 處返回映象地址。偏移量被編碼為單個位元組。 |
opPROGRAM_START | 操作碼 |
LC0(USER_SLOT) | 使用者 slot(1 = 程式 slot)被編碼為單個位元組常量 |
GV0(0) | 映象大小位於全域性變數偏移 0 處。 |
GV0(4) | 映象地址位於全域性變數偏移 4 處。 |
LC0(0) | 除錯模式(0 = 普通)被編碼為單個位元組常量 |
30000000800800C008820100842E2E2F70726A732F42726B50726F675F534156452F44656D6F2E7270660060640301606400
bbbbmmmmtthhhhccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccCCCCCCCCCC
bbbb = 訊息中的位元組數為 48,不包含包長度位元組
mmmm = 訊息計數器
tt = 命令型別 - 直接命令無需應答
hhhh = 頭部 – 變數分配。
cc/CC = 位元組碼
hhhh = 10 個最低有效位是全域性變數的個數,6 個最高有效位是區域性變數的
4.2.2 以電源 50 向前啟動電動機 B&C 3 轉,並在目的地制動
這個例子使用了特殊的 OUTPUT_STEP_SPEED 電動機命令。這個命令在電動機列表中為電動機設定了速度((setpoint))。命令包含加速和減速部分。特別是減速對於更精確地到達最終目的地非常有用。電動機在 3 轉(3 * 360 度)結束後製動。
opOUTPUT_STEP_SPEED,LC0(LAYER_0),LC0(MOTOR_A + MOTOR_B),LC1(SPEED_50),LC0(0),LC2(900),LC2(180),LC0(BRAKE)
指令 | 說明 |
---|---|
opOUTPUT_STEP_SPEED | 操作碼 |
LC0(0) | Layer 0 - 被編碼為單個位元組常量 |
LC0(MOTOR_A + MOTOR_B) | 電動機 B & C (電動機列表)被編碼為單個位元組常量 |
LC1(SPEED_50) | 速度 50% 被編碼為單個位元組常量 |
LC0(0) | 沒有 STEP1,即從開始全速 - 編碼為單個位元組常量 |
LC2(900) | 2.5 周(900 度) STEP2 - 被編碼為兩個位元組 |
LC2(180) | 0.5 周(180 度) STEP3 為了更精確的到達目的地 - 被編碼為兩個位元組 |
LC0(BRAKE) | 制動(1)- 被編碼為單個位元組常量 |
向 brick 傳送的位元組:
1200xxxx800000AE000681320082840382B40001
Bbbbmmmmtthhhhcccccccccccccccccccccccccc
bbbb = 訊息中的位元組數為 21,不包含包長度位元組
mmmm = 訊息計數器
tt = 命令型別 - 直接命令無需應答
hhhh = 頭部 – 變數分配。
cc/CC = 位元組碼
hhhh = 10 個最低有效位是全域性變數的個數,6 個最高有效位是區域性變數的
4.2.3 讀取感測器埠 3 上的光感測器值
這個直接命令將讀取連線在 brick 的輸入埠 3 上的光感測器。模式被顯式地設為模式 0(零)即光感測器(0 – 100 pct.)的本地模式 0。返回值是一個32 位 float,編碼為 SI 0-100 pct。
預設的 32 位浮點數(SI 0-100 pct)。
opINPUT_DEVICE,LC0(READY_SI),LC0(LAYER_0),LC0(SENSOR_PORT_3),LC0(DO_NOT_CHANGE_TYPE),LC0(MODE_0),LC0(ONE_DATA_SET),LCO(GLOBAL_VAR_INDEX0)
指令 | 說明 |
---|---|
opINPUT_DEVICE | 輸入相關的操作碼 |
LC0(READY_SI) | 命令(READY_SI)被編碼為單個位元組常量 |
LC0(LAYER_0) | Layer number (0 = 這個特定 brick) 被編碼為單個位元組常量 |
LC0(SENSOR_PORT_3) | 連線到埠 3 ((1-4 / 0-3 內部的)上的感測器被編碼為單個位元組常量 |
LC0(DO_NOT_CHANGE_TYPE) | 如果設定為 0 (零) - 不改變型別 - 被編碼為單個位元組常量 |
LC0(MODE_0) | 模式 0 - 被編碼為單個位元組常量 |
LC0(ONE_DATA _SET) | 資料集的個數(模式 0 只有 1 個(pct))- 被編碼為單個位元組常量 |
LC0(GLOBAL_VAR_INDEX0) | 把返回值放在全域性變數的索引 0 (零)處 - 被編碼為單個位元組常量 |
向 brick 傳送的位元組:
0D00xxxx000400991D000200000160
BbbbmmmmtthhhhCCCCCCCCCCCCCCCC
bbbb = 訊息中的位元組數為 13,不包含包長度位元組
mmmm = 訊息計數器
tt = 命令型別 - 直接命令需要應答
hhhh = 頭部 – 變數分配。這 4 個位元組在全域性變數中保留
CC/cc/CC/cc = 位元組碼
hhhh = 10 個最低有效位是全域性變數的個數,6 個最高有效位是區域性變數的
4.2.4 讀取連線到埠 1 的光感測器為 COLOR
這個直接命令將讀取連線在 brick 的輸入埠 1 上的光感測器。模式被顯式地設為模式 2 “COLOR 模式”。感測器將返回一個 0 - 8(包含)之間的值,即感測器前的物體的顏色。返回值是 32 位浮點數,編碼為 0-8。
opINPUT_DEVICE,LC0(READY_SI),LC0(LAYER_0),LC0(SENSOR_PORT_1),LC0(DO_NOT_CHANGE_TYPE),LC0(MODE_2),LC0(ONE_DATA_SET),LCO(GLOBAL_VAR_INDEX0)
指令 | 說明 |
---|---|
opINPUT_DEVICE | 輸入相關的操作碼 |
LC0(READY_SI) | 命令(READY_SI)被編碼為單個位元組常量 |
LC0(LAYER_0) | Layer number (0 = 這個特定 brick) 被編碼為單個位元組常量 |
LC0(SENSOR_PORT_1) | 連線到埠 1 ((1-4 / 0-3 內部的)上的感測器被編碼為單個位元組常量 |
LC0(DO_NOT_CHANGE_TYPE) | 如果設定為 0 (零) - 不改變型別 - 被編碼為單個位元組常量 |
LC0(MODE_2) | 模式 2 - 被編碼為單個位元組常量 |
LC0(ONE_DATA _SET) | 資料集的個數(模式 0 只有 1 個(pct))- 被編碼為單個位元組常量 |
LC0(GLOBAL_VAR_INDEX0) | 把返回值放在全域性變數的索引 0 (零)處 - 被編碼為單個位元組常量 |
向 brick 傳送的位元組:
0D00xxxx000400991D000000020160
BbbbmmmmtthhhhCCCCCCCCCCCCCCCC
bbbb = 訊息中的位元組數為 13,不包含包長度位元組
mmmm = 訊息計數器
tt = 命令型別 - 直接命令需要應答
hhhh = 頭部 – 變數分配。這 1 個位元組在全域性變數中保留
CC/cc/CC/cc = 位元組碼
hhhh = 10 個最低有效位是全域性變數的個數,6 個最高有效位是區域性變數的
4.2.5 在 level 2 播放 1 Kz 音調 1 秒
opSOUND,LC0(TONE),LC1(2),LC2(1000),LC2(1000)
指令 | 說明 |
---|---|
opSOUND | 聲音相關的操作碼 |
LC0(TONE) | 命令(TONE)被編碼為單個位元組常量 |
LC1(2) | 聲音 leve2 被編碼為 1 個常量位元組 |
LC2(1000) | 頻率 1000 Hz 被編碼為 2 個常量位元組 |
LC2(1000) | 持續時長 1000 ms 被編碼為 2 個常量位元組 |
向 brick 傳送的位元組:
0F00xxxx8000009401810282E80382E803
Bbbbmmmmtthhhhcccccccccccccccccccc
bbbb = 訊息中的位元組數為 15,不包含包長度位元組
mmmm = 訊息計數器
tt = 命令型別 - 直接命令無需應答
hhhh = 頭部 – 變數分配。
cc/CC = 位元組碼
hhhh = 10 個最低有效位是全域性變數的個數,6 個最高有效位是區域性變數的
4.2.6 在螢幕上展示一幅圖片
清除螢幕,並在螢幕上的座標 (x = 0, y= 50) 處繪製 bmp 圖片 “mindstorms.rgf”。首先螢幕由 FILLWINDOW 子命令清除,然後 bmp 圖片檔案由子命令 BMPFILE 載入。在 UPDATE 子命令發出之前螢幕上什麼都不會發送。
opUI_DRAW,LC0(FILLWINDOW),LC0(BG_COLOR),LC2(0),LC2(0),opUI_DRAW,LC0(BMPFILE),LCO(FG_COLOR),LC2(0),LC2(50),LCS,’u’,’i’,’/‘,’m’,’i’,’n’,’d’, ‘s’,’t’,’o’,’r’,’m’,’s’,’.’,’r’,’g’,’f’,0,opUI_DRAW,LC0(UPDATE)
指令 | 說明 |
---|---|
opUI_DRAW | 繪製相關的操作碼 |
LC0(FILLWINDOW) | 命令(FILLWINDOW)被編碼為單個位元組常量 |
LC0(BG_COLOR) | 顏色設定背景顏色 - 即清除螢幕被編碼為單個位元組常量 |
LC2(0) | 起始 y(0 表示整個螢幕)被編碼為單個位元組常量 |
LC2(0) | 結束 y(0 表示整個螢幕)被編碼為單個位元組常量 |
opUI_DRAW | 繪製相關的操作碼 |
LC0(BMPFILE) | 命令(BMPFILE)被編碼為單個位元組常量 |
LC0(FG_COLOR) | 顏色設定前景顏色被編碼為單個位元組常量 |
LC2(50) | 起始 y 座標 50 被編碼為 2 個位元組 |
LC2(0) | 起始 x 座標 0 被編碼為 2 個位元組 |
LCS | 編碼:字串(以 0 結尾) |
“ui/mindstorms.rgf” | 檔案路徑和名稱 |
0 | 字串的 0 結尾 |
opUI_DRAW | 繪製相關的操作碼 |
LC0(UPDATE) | 命令(UPDATE)“執行所有的圖形操作” 被編碼為單個位元組常量 |
向 brick 傳送的位元組:
2C000000800000841300820000820000841C018200008232008475692F6D696E6473746F726D732E726766008400
BbbbmmmmtthhhhCCCCCCCCCCCCCCCCCCccccccccccccccccccccccccccccccccccccccccccccccccccccccccCCCC
bbbb = 訊息中的位元組數為 44,不包含包長度位元組
mmmm = 訊息計數器
tt = 命令型別 - 直接命令無需應答
hhhh = 頭部 – 變數分配。
CC/cc/CC/cc = 位元組碼
hhhh = 10 個最低有效位是全域性變數的個數,6 個最高有效位是區域性變數的
ofollow,noindex">原文