2013年4月4日 星期四

Arduino: 串列輸入 (RS232 INPUT)


   串列通信是在實現PC與u'P微控制器間相互通信最簡單的辦法。之前的PC上一般都配有標準的RS-232或者RS-422接口來實現串列通信,但現在這種情況已經發生了一些改變,大家更傾向於使用USB這樣一種更快速但同時也更加複雜的方式來實現串行通信。

儘管在有些計算機上現在已經找不到RS-232或者RS-422端口了,但我們仍可以通過USB /串列或者PCMCIA/串列這樣的轉換器,在這些設備上得到傳統的串列端口上。



通過串列連接的Arduino在交互式設計中能夠為PC提供一種全新的相互通信方式,例如用PC控制一些看來非常複雜的事情,像聲音和視頻等。很多場合中會要求Arduino能夠通過串列接收來自於PC的命令,並完成相應的功能,這可以通過Arduino語言中提供的Serial.read()函數來實現。

在實驗中我們不需要任何額外的電路,而只需要用串列線將ArduinoPC連起來就可以了,相應的Arduino程式碼如下:


int ledPin = 12;
int val;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = Serial.read();
  if (-1 != val) {
    if ('H' == val or 'h'==val ) {  //讀取 H 或 h
      digitalWrite(ledPin, HIGH);
      Serial.println("LED ON !");
      delay(1500);
      digitalWrite(ledPin, LOW);
      Serial.println("LED OFF !");
     }
  }
}




把程式下載到Arduino模組中之後,在Arduino IDE開發環境中打開串列監視器並將Baud rate設置為9600,然後向Arduino發送字碼 H 或 h,如下圖所示:



該程式程運行後會不斷使用Serial.read()函數從串列口獲得資料數據。 Arduino語言提供的這個函數是不阻塞的,也就是說不論串口上是否真的有數據到達,該函數都會立即返回。

Serial.read()函數每次只讀取一個Word的資料數據,當串列上有數據到達的時候,該函數的返回值為到達的數據中第一個字符的ASCII碼;當串列上沒有數據到達的時候,該函數的返回值則為-1


Arduino語言的參考手冊中沒有對Serial.read()函數做過多的說明,我的一個疑問是如果PC一次發送太多的數據,Arduino是否提供相應的串列口緩衝功能來保證數據不會丟失?

Arduino語言中提供的另外一個函數Serial.available()或許能夠幫助我們用實驗來進行驗證:


int ledPin = 12;
int val;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = Serial.read();
  if (-1 != val) {
    if ('H' == val or 'h' ==val ) {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);

      Serial.print("Available: ");
      Serial.println(Serial.available(), DEC);
    }
  }
}



函數Serial.available()的功能是返回串列緩衝區中當前剩餘的Char個數,按照Arduino提供的函數的說明串列緩衝區中最多能緩衝128個chars。

我們可以一次給Arduino模組發送多個Chars,來驗證這一功能:

在這一實驗中,每當Arduino成功收到一個字碼(chars) H 或h,連接在數位I/O口 接12上的LED就會閃爍一次:






沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...