Arduino和处理代码错误" disabling_serialevent()"

时间:2014-09-27 01:40:13

标签: serial-port arduino processing

我在处理应用程序时遇到以下错误,有时它完美无缺。

  

错误,禁用COM2的serialEvent()

     

以下是代码:

的Arduino' S:

    void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue1 = analogRead(A0);
  int sensorValue2 = analogRead(A1);
  Serial.print(sensorValue1);
  Serial.write("-");
  Serial.println(sensorValue2);
  delay(1);
}

处理' S:

 import processing.serial.*;

 Serial myPort;        // The serial port
 void setup () {
 size(1043, 102);
 background(255);
 myPort = new Serial(this, Serial.list()[1], 9600);
 println(Serial.list());
 myPort.bufferUntil('\n');
 }

 void draw () {
 // everything happens in the serialEvent()
 }

 void serialEvent (Serial myPort) {
 background(255);
 String inString = myPort.readStringUntil('\n');
 if (inString != null) {
 inString = trim(inString);
// String inByte = inString;
 int[] inStr = int(split(inString,'-'));
 println(inStr);

fill(0);
rect(10,2,inStr[0],46);

rect(10,52,inStr[1],46);

fill(255);
rect(400,14,245,21); 

fill(0);
textAlign(CENTER);
textSize(14);
text("1st value: "+inStr[0]+" 2nd value: "+inStr[1],width/2,30);
 }
 }

当我删除以下部分代码时,应用程序正常工作。

fill(0);
rect(10,2,inStr[0],46);

rect(10,52,inStr[1],46);

fill(255);
rect(400,14,245,21); 

fill(0);
textAlign(CENTER);
textSize(14);
text("1st value: "+inStr[0]+" 2nd value: "+inStr[1],width/2,30);

我正在使用Win7,处理版本2.2.1& Arduino ver1.0.5-r2。

我是所有串行通讯的新手......

3 个答案:

答案 0 :(得分:2)

你必须在try-catch中包围你的serialEvent方法体:

void serialEvent (Serial myPort) {

  try {
    ...
    your code
    ...
  }
  catch(RuntimeException e) {
    e.printStackTrace();
  }

}

您的serialEvent实现可能会抛出异常。

答案 1 :(得分:0)

将你的代码放在draw()函数中,只需使用serialEvent()来改变变量的值(记得初始化它们)。

使inStr成为一个全局变量,你可以定义它的长度并用0初始化它。

应该是这样的:

import processing.serial.*;

Serial myPort;        // The serial port
int[] inStr = {0,0};

void setup () {
  size(1043, 102);
  background(255);
  myPort = new Serial(this, Serial.list()[1], 9600);
  println(Serial.list());
  myPort.bufferUntil('\n');
}

void draw () {
  fill(0);
  rect(10,2,inStr[0],46);

  rect(10,52,inStr[1],46);

  fill(255);
  rect(400,14,245,21); 

  fill(0);
  textAlign(CENTER);
  textSize(14);
  text("1st value: "+inStr[0]+" 2nd value: "+inStr[1],width/2,30);  
}

void serialEvent (Serial myPort) {
  String inString = myPort.readStringUntil('\n');
  if (inString != null) {
    inString = trim(inString);
    inStr = int(split(inString,'-'));
    println(inStr);
  }
}

将来尽量不要使用serialEvent来完成draw()

的工作

答案 2 :(得分:0)

// at the top of the program:
float xPos = 400; // horizontal position of the graph
float yPos = 300; // vertical position of the graph
float zPos = 300;
float regiypos = yPos;
float regizpos = zPos;
int par = 5;

import processing.serial.*;
Serial myPort;        // The serial port

int lf = 10;    // Linefeed in ASCII
String myString = null;
float num;  
void setup () {

  size(800, 600);        // (Width, Height) window size

  myPort = new Serial(this, "COM4", 115200);

  background(#081640);
  noLoop();                                                //-- Ne fussál folyamatosan

}

void draw () {
   // draw the line in a pretty color:
  stroke(#A8D9A7);
  line(xPos-par,regiypos, xPos, yPos);                        // (x1,y1,x2,y2) Origó a bal felső sarokban  
  regiypos = yPos;                                        // ami most új volt azt megőrzi, hogy legyen mivel összekötni

  stroke(#ff00A7);
  line(xPos-par,regizpos, xPos, zPos);         
  regizpos = zPos;

  // at the edge of the screen, go back to the beginning:
  if (xPos >= width) {
    xPos = 0;
    // clear the screen by resetting the background:
    background(#EDA430);
    background(#081640);
  }
  else {
    // increment the horizontal position for the next reading:
    xPos+=par;
  }
}

void serialEvent (Serial myPort) {                      //-- Nem fut folyamatosan, hanem csak akkor ha adat érkezik, mert akkor meghívodik ez a fv.
  // get the byte:
//  float inByte = myPort.read();
  // print it:
//  println(inByte);
  myString = myPort.readStringUntil(lf);
  if (myString != null) {
      print(myString);  // Prints String
      String[] q = splitTokens(myString,":");
      if (q.length==2){
          print(q[0]);  // Acceltoroll print
          print(q[1]);  // Gyrotoroll print

          num=float(q[0]);  // Converts and prints float
          yPos = height/2 - num;
          num=float(q[1]);  // Converts and prints float
          zPos = height/2 - num;
          redraw();             //-- Melynek a végén van a redraw() parancs, mely egyszer lefutattaja a draw()-ban lévő részt.
      }
  }  
}

突出显示的部分是:

if (q.length==2) {

          print(q[0]);  // Acceltoroll print
          print(q[1]);  // Gyrotoroll print

          num=float(q[0]);  // Converts and prints float
          yPos = height/2 - num;
          num=float(q[1]);  // Converts and prints float
          zPos = height/2 - num;
          redraw();             //-- Melynek a végén van a redraw() parancs, mely egyszer lefutattaja a draw()-ban lévő részt.
}

这将解决您的问题。问题是如果缓冲区已满并且开始覆盖数据,则q [1]可能不存在...

只需将代码粘贴到记事本++即可获得更好的视图。