所以我就找了一下Arduino序列通訊的語法整理在這一篇之中。
最主要的有四個指令:
Serial.begin ( ) - 開啟 Serial Port 並設定通訊速率 (baud rate)
Serial.print ( ) - 傳送資料到外部電腦
而我們主要的目標就是希望可以從Arduino傳資料到PC去,也可以從PC傳資料到Arduino來。
以下有三個範例來試試。
1. 將Arduino的值傳到 PC (Arduino >> PC)
如下圖接一個可變電阻來進行測試,
Serial.read ( ) - 接收來自外部電腦的資料
Serial.available ( ) - 取得 Serial Port 可讀取的資料位元組數目 (number of bytes),如果 Serial port 有資料進來,Serial.available ( ) 會回傳大於 0 的數值。
Serial.available ( ) - 取得 Serial Port 可讀取的資料位元組數目 (number of bytes),如果 Serial port 有資料進來,Serial.available ( ) 會回傳大於 0 的數值。
而我們主要的目標就是希望可以從Arduino傳資料到PC去,也可以從PC傳資料到Arduino來。
以下有三個範例來試試。
1. 將Arduino的值傳到 PC (Arduino >> PC)
如下圖接一個可變電阻來進行測試,
除了傳回到PC端,也希望可以由PC端傳到Arduino上。
這個範例就運用LCD來顯示由PC端輸入的字元。
LCD銀幕的用法與接線請參考:Arduino: 使用 16x2 的 LCD 銀幕
Code
#include <LiquidCrystal.h>
這個範例就運用LCD來顯示由PC端輸入的字元。
LCD銀幕的用法與接線請參考:Arduino: 使用 16x2 的 LCD 銀幕
Code
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); // 定義LCD大小
}
void loop() {
char Nums[10];
if(Serial.available () > 0) {
lcd.clear () ;
lcd.print("Data = "); // 顯示字元
lcd.setCursor(7, 0);
Serial.readBytes(Nums,10);
lcd.print (Nums);
}
}
操作的方式如下圖,打開Serial Monitor,在最上方輸入要顯示的文字,再按Send。
就會在LCD上顯示電腦上輸入的文字。
3. 用PC控制Arduino,以決定動作的Case
當我們可以從PC端輸出之後,更進一步地是輸出代號,Arduino就進入Case之中,
如此就可以在Case之中建立我們要的程式。
Code
void setup() {
Serial.begin(9600);
for (int ledPin = 2; ledPin <= 4; ledPin++) {
pinMode(ledPin, OUTPUT);
}
}
void loop() {
if (Serial.available() > 0) { // 檢查是否有資料可供讀取
int data = Serial.read(); // 讀取進來的 byte
switch (data) { // 根據收到的字元決定要打開哪顆 LED
case '1':
digitalWrite(2, HIGH);
break;
case '2':
digitalWrite(3, HIGH);
break;
case '3':
digitalWrite(4, HIGH);
break;
default:
for (int thisPin = 2; thisPin <= 6; thisPin++) {
digitalWrite(thisPin, LOW); // 關掉所有的 LED
}
}
}
}
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); // 定義LCD大小
}
void loop() {
char Nums[10];
if(Serial.available () > 0) {
lcd.clear () ;
lcd.print("Data = "); // 顯示字元
lcd.setCursor(7, 0);
Serial.readBytes(Nums,10);
lcd.print (Nums);
}
}
操作的方式如下圖,打開Serial Monitor,在最上方輸入要顯示的文字,再按Send。
就會在LCD上顯示電腦上輸入的文字。
3. 用PC控制Arduino,以決定動作的Case
當我們可以從PC端輸出之後,更進一步地是輸出代號,Arduino就進入Case之中,
如此就可以在Case之中建立我們要的程式。
Code
void setup() {
Serial.begin(9600);
for (int ledPin = 2; ledPin <= 4; ledPin++) {
pinMode(ledPin, OUTPUT);
}
}
void loop() {
if (Serial.available() > 0) { // 檢查是否有資料可供讀取
int data = Serial.read(); // 讀取進來的 byte
switch (data) { // 根據收到的字元決定要打開哪顆 LED
case '1':
digitalWrite(2, HIGH);
break;
case '2':
digitalWrite(3, HIGH);
break;
case '3':
digitalWrite(4, HIGH);
break;
default:
for (int thisPin = 2; thisPin <= 6; thisPin++) {
digitalWrite(thisPin, LOW); // 關掉所有的 LED
}
}
}
}
結論:
了解了這些通訊方式,可以更方便我們操作卡片,甚至與其它軟體的結合。
我想問一下,假如我想把心跳模組的serial數值儲存或拿來利用顯示在arduino的tft螢幕上可以怎麼做?
回覆刪除您可以參考這一篇
刪除http://ming-shian.blogspot.tw/2013/09/arduino-lcd.html
把您 Serial 的數值定義好之後,再叫 lcd 顯示出來
謝謝,但是我如果是用tft的觸控螢幕,是不是還要看看他的開源代碼有沒有支援
刪除tft的觸控螢幕我是沒有使用過,不過你可以參考以下網頁,應該對你有些幫助。
刪除http://www.practicalarduino.com/projects/touch-control-panel
作者已經移除這則留言。
回覆刪除能不能讓電腦PC直接呼叫Arduino的傳訊程式
回覆刪除可以的話是要怎麼實現
ming大哥你好,請問我想用labview寫個程式跟arduino做通訊,去控制步進電機,旦通訊上有overloading的問題,想透過visa去控制。
回覆刪除請問您這個方式是將程式碼燒製arduino板上,再用labview送一個數值進去,arduino就會跑case裡面的動作嗎?
我想用步進馬達的函數庫,配合你的方法控制步進馬達,請問你覺得可行嗎?
best regard.