2016年3月5日 星期六

ROSA 系統開發 28 ─ 指令讀入

http://4rdp.blogspot.com/2016/03/rosa-28.html


// (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 COM_READ(void) {
  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 傳入,反之從藍牙裝置傳入。

待續 .....

沒有留言:

張貼留言