Arduino 和 Processing 通信問題(available()與read()問題)

案例說明:Arduino按鈕按下時,processing畫出一圈同心圓。

Arduino連線圖:

連線圖

先看Arduino代碼:

int in = 12;//定義按鈕引腳
void setup()
{
  pinMode(in,INPUT);
  Serial.begin(9600);//設置波特率
}
void loop()
{ 
  int v = digitalRead(in);//讀取引腳電壓以檢測是否按下按鈕
  if(v == HIGH){
    Serial.print(1); //如果按下,發送1
    delay(300);//延遲0.3秒,防止操作過快
    }
}

下面是Processing代碼:

import processing.serial.*;//導入需要的包
Serial myPort = new Serial(this, "COM4", 9600);//實例化連接對象,這裏的波特率與上述一致
int i=10;//畫的圓的個數
int x,y;//圓的座標
void setup(){//默認只執行一遍的方法
size(800,800);//設置窗體大小
}
void draw(){//默認循環執行
  int j = myPort.available();
    //available()方法返回當前剩餘的字符個數,即發送一個數據就返回1,發兩個就返回2
  myPort.read();
    //read()方法將 取出 並 讀取 發送過來的數據,也就是說,如果不取出,available()返回的數值越來越大
  println(j);//無實際意義,可以看到available()返回的數值
  if(j>0){//如果獲取數據,j就會大於0
  x =int(random(800));//隨機取x軸座標
  y =int(random(800));//隨機取y軸座標
  while(i>=0)//畫圓的動作
  {
  ellipse(x,y,20+i*8,20+i*8);
  fill(random(255),random(255),random(255));//隨機組合rgb以生成隨機顏色
  i--;  
  //之所以用--而不用++,是因爲先畫小圓會被大的圓蓋住
  }
}else{
 println("nothing happend"); 
 i = 10;//圓的個數初始化,不然就畫不出圓了
  }
}

容易出問題的就是available()這裏,通常想,只要判斷有數據過來就行,執行完了就會再次執行draw()方法,但是判斷的方式是available()方法的返回值是否是大於0的,如果不執行read()方法,則數據會一直積累,即永遠不會小於0,所以執行的結果很可能是隻有一個圖形,下面就不再執行了。

附效果圖一張:

效果圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章