只要通过串口接受数据,处理draw()就会停止

时间:2017-09-26 01:51:14

标签: java random processing

我建立了一个实验室来测试MCU中的随机数发生器。 MCU生成范围为(0,255)的randrom,并将它们发送到PC。在PC中,我写了一个处理pde来逐行读取并将它们绘制为x,y来绘制随机点。

我的MCU打印出如下:

141,188
255,198
193,224
83,138
53,68
231,142
233,232
187,210
221,204
207,86
17,240
...

随机数打印为“%d,%d \ r \ n”。到目前为止,单片机中的RNG运行良好。

在PC处理pde代码中,如果我使用Math.random()作为本地RNG,它运行良好,如果我读取每一行并打印到控制台,它也运行良好。但是,如果我将它们合并在一起,draw()将绘制一些点然后停止.....

/*
 * Random_Serial_2D.pde
 */

import processing.serial.*;
import java.util.StringTokenizer;

Serial myPort;  // The serial port
String inString = null;

void setup() {
  size(256, 256);

  noSmooth();
  background(0);
  translate(0,0);

  stroke(255);

  printArray(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600);
}

void draw() {
  int x, y;
  String[] sa = null;
  int sz;

  while (myPort.available() > 0) {
    myPort.bufferUntil('\n');
    if (inString != null){
      //print(inString);
      inString = inString.replace("\r\n","");
      sa = inString.split(",");
      sz = sa.length;

      if (sz==2){
        x = Integer.parseInt(sa[0]);
        y = Integer.parseInt(sa[1]);        
        point(x,y);      
      }
      inString = null;
    }
  }
}

void serialEvent(Serial p){
  inString = p.readString();
}

我选择了Processing,因为它是专为交互而设计的,可能代码中有一个错误,但我对它没有任何线索。

我应该将它实现为两个单独的线程,一个用于读取和推送到队列,另一个用于绘制?

1 个答案:

答案 0 :(得分:0)

您是否只是生成无限的随机数?如果是这样,这是一个无限循环:

while (myPort.available() > 0) {
  

我应该将它实现为两个单独的线程,一个用于读取和推送到队列,另一个用于绘制?

可能不是。您可能只想一次读取一行。或者修改你的程序,这样它就不会发送无限的随机数。