我在处理应用程序时遇到以下错误,有时它完美无缺。
错误,禁用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。
我是所有串行通讯的新手......
答案 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]可能不存在...
只需将代码粘贴到记事本++即可获得更好的视图。