// (C) 2015-2016, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)
#define NONE 0
static char cmd0[64] = "";
static char cmd1[64] = "";
static byte from;
static byte index_cmd = 0; // command index
char a;
char i;
if (cmd1[0] != NONE) return 1;
if (Serial.available() > 0) { // USB
from = 1;
a = Serial.read();
}
else if (BT.available() > 0) { // BT
from = 2;
a = BT.read();
}
else
return 0;
if (a != '\r' && a != '\n') {
cmd0[index_cmd++] = char(a);
cmd0[index_cmd] = 0;
return 0;
}
for (i = 0; i!=64 ; i++){
if ((cmd1[i] = toUpperCase(cmd0[i])) == NONE) break;
}
cmd0[0] = index_cmd = NONE;
if (cmd1[0] == NONE)
return 0;
else
return 1;
}
開發 ROSA 採用一些不同於一般程式設計的技巧,因為 Arduino 這類嵌入式系統,MCU 記憶體空間不大,建議採取全域變數以及定址方式設計,所以我也沒用 C 語言的 string,而是用字元陣列方式處理,雖然花了時間重寫已有函數庫的程式,看似浪費時間的多餘舉動,不過我可以確定一些事情,使用固定記憶位址字元陣列,可以確保字串字元記憶位址是固定的,而非浮動的,因為是在設計 ROSA 「作業系統」,系統程式的穩定性非常重要,引用別人寫的東西,總有些東西不是自己能完全掌控的,用 string 雖然方便,但是記憶位址常常搬動有許多不確定因素,為了系統程式穩定性,以及需要對記憶空間需要全然掌控,所以才會自己寫字元處理。當然如果你可以完全掌控狀況,引用 string 函數庫也是可以的。
ROSA 限制字串長度 64 字元,基本上應該夠用了。CMD_READ() 這副程式專門讀取 USB 或 藍牙裝置傳入的指令,無論那一個傳來,都將字元放在 cmd0[] 陣列,當字串以 '\r' (Carriage Return, ASCII 0x0D) 或 '\n' (Line Feed, ASCII 0x0A) 結尾時,cmd0[] 字元陣列的內容會改成大寫字元搬到 cmd1[] 準備做下一步解譯處理,然後清除 cmd0[] 準備接收下一組傳入的命令。
from 變數被設定成 1 時,表示指令從 USB 傳入,反之從藍牙裝置傳入。
待續 .....
沒有留言:
張貼留言