如何解决错误“错误,禁用COM14 null的serialEvent()”?

时间:2015-06-07 15:48:36

标签: java arduino processing microcontroller arduino-uno

我正在使用处理2.2.1。我试过的代码如下,但它给出错误“错误,禁用COM14 null的serialEvent()”。我正在设计温度计,它将数据串行发送到计算机。请帮助我,我是新人。

import processing.serial.*;
Serial port;
String tempc="";
String tempf="";
String data="";
int index = 0;
PFont font;
void setup()
{
size(400,400);
port = new Serial(this, "COM14", 9600);
port.bufferUntil('.');
font = loadFont("AgencyFB-Bold-200.vlw");
textFont(font,200);
}

void draw()  
{
background(0,0,0);  
fill(46,209,2);
text(tempc,70,175);
fill(0,102,153);
text(tempf,70,370); 
}
void serialEvent (Serial port)
{
data = port.readStringUntil('.'); 
data = data.substring(0,data.length()-1);
index = data.indexOf(","); 
tempc = data.substring(0,index);
tempf = data.substring(index+1,data.length());
}

3 个答案:

答案 0 :(得分:0)

请检查您的端口 COM14 是否存在且是否正确: println(Serial.list());

答案 1 :(得分:0)

除了Darius'回答,在serialEvent()中注意 Null 字符串或任何其他潜在的解析错误。

您可以尝试这样的事情:

void serialEvent (Serial port)
{
    data = port.readString('.'); 
    println("raw data"+data)
    try{
        data = data.substring(0,data.length()-1);
        index = data.indexOf(","); 
        tempc = data.substring(0,index);
        tempf = data.substring(index+1,data.length());
    }catch(Exception e){
        println("Error parsing:")
        e.printStackTrace();
    }
}

使用注意readString(),因为在设置中调用了bufferUntil()

答案 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]可能不存在...