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,所以执行的结果很可能是只有一个图形,下面就不再执行了。

附效果图一张:

效果图

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值