在上次的文章 [教學] NXT Bluetooth – 傳/收值範例 裡,我們學到了如何讓 Master 傳值給 Slave 收取。但是,光是單方面的發出指令是不夠的,還必須要讓兩台NXT可以互相「溝通」,也就是要讓 Salve 要可以回傳值給 Master。請看以下兩組程式,當Master的觸碰感應器按下時,Slave的A馬達會轉三秒,轉完後回傳值給Master,Master接收到Slave回傳的訊息後便發出提示音:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//master 請將觸碰感應器接在1號輸入端 #define BT_CONN 1 #define OUTBOX 5 #define INBOX 3 sub BTCheck (int conn) { if (!BluetoothStatus(conn)==NO_ERR) { TextOut(5,LCD_LINE2,"Error");//顯示連線錯誤訊息 Wait(1000); Stop(true); }//if }// BTCheck task main() { BTCheck (BT_CONN); //檢查與slave之連線 SetSensorTouch(S1); bool n; while(true) { until(Sensor(S1) == 1); SendRemoteBool(BT_CONN, OUTBOX, 1); while(n == 0) { ReceiveRemoteBool(INBOX, true, n); } PlayTone(440,300); Wait(300); n = 0; } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//slave #define INBOX 5 #define OUTBOX 3 sub BTCheck(int conn) { if (!BluetoothStatus(conn)==NO_ERR) { TextOut(5,LCD_LINE2,"Error"); //顯示連線錯誤訊息 Wait(1000); Stop(true); }//if }//BTCheck task main() { BTCheck(0); // 從slave來看,master都是連接在line 0 bool bval; while(true) { while(bval == 0) { ReceiveRemoteBool(INBOX, true, bval); } OnFwd(OUT_A,100); Wait(3000); Off(OUT_A); SendResponseBool(OUTBOX,1); bval = 0; }//while }//main |
在 Slave 的程式裡,我們用到了 SendResponseBool() 指令,這個指令可以讓 Slave 直接回傳訊息給 Master,所以我們不需要選要傳的 line,只需要設定要傳的信箱(第一個參數)與要傳的值(第二個參數)就好,真正達到了 Master-Slave 互通有無。
有任何建議或疑問歡迎提出討論!另外以上內容摘自 CAVE 即將上市的書 – 機器人新視界 NXT與NXC 第二版 "機器人對話"
同時非常感謝 Bridan 先生對本章所提出的建議,謝謝您。
阿吉
謝謝您給我機會看第一手初稿,只是儘我所能補充意見而已。
[版主回覆04/26/2010 13:58:19]Bridan客氣了, 有您幫忙看稿, 實為小弟與眾多讀者之福.