串列通信是在實現PC與u'P微控制器間相互通信最簡單的辦法。之前的PC上一般都配有標準的RS-232或者RS-422接口來實現串列通信,但現在這種情況已經發生了一些改變,大家更傾向於使用USB這樣一種更快速但同時也更加複雜的方式來實現串行通信。
儘管在有些計算機上現在已經找不到RS-232或者RS-422端口了,但我們仍可以通過USB /串列或者PCMCIA/串列這樣的轉換器,在這些設備上得到傳統的串列端口上。
通過串列連接的Arduino在交互式設計中能夠為PC提供一種全新的相互通信方式,例如用PC控制一些看來非常複雜的事情,像聲音和視頻等。很多場合中會要求Arduino能夠通過串列接收來自於PC的命令,並完成相應的功能,這可以通過Arduino語言中提供的Serial.read()函數來實現。
在實驗中我們不需要任何額外的電路,而只需要用串列線將Arduino和PC連起來就可以了,相應的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.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就會閃爍一次:
沒有留言:
張貼留言