当前位置: 首页 > 知识库问答 >
问题:

Arduino/处理串行通信时出错

伏德义
2023-03-14

我对Arduino和Processing都比较陌生,我一直在开发一种利用两者之间串行通信的代码。我的Arduino代码从压电传感器读取并打印数值,然后将数值发送给Processing,Processing根据数值绘制特定形状。该代码以前已经工作过,但由于某种原因,它不再工作。一切都会编译,但当我运行处理代码时,草图窗口是空的,并且仍然是空的。有几次“错误,禁用serialEvent()”出现了,但我只是拔下了Arduino板,关闭了程序,重新启动了所有程序。错误不再显示,但我的处理草图仍然没有显示在屏幕上。有人能告诉我我的代码出了什么问题吗?我真的很感谢你的帮助。

Arduino代码:

int ledPin = 13;      
int knockSensor = A0; 
byte val = 0;         
int statePin = LOW;   
int THRESHOLD = 5;  
int sensorReading = 0;

void setup() {
 pinMode(ledPin, OUTPUT); 
 Serial.begin(9600);       
}

void loop() {
  sensorReading = analogRead(knockSensor);    

  if(sensorReading > 0)
  {
    Serial.println(sensorReading, DEC);
  }

  if (sensorReading != 0)
    Serial.println(sensorReading);
  delay(100);  
}

处理代码:

import processing.serial.*;

Serial port;

int centerX = 550;
int centerY = 400;

float val;
float ellipseX;
float ellipseY;
float ellipseW;
float ellipseH;
float ellipseXX;
float ellipseYY;
float ellipseWW;
float ellipseHH;
float lineX;
float lineY;
float lineXX;
float lineYY;

void setup(){
  background(255);
  size(1100,800); 
  frameRate(10);
  smooth();

  String portname = "/dev/tty.usbmodem1411"; 

  //String portname = Serial.list()[0];
  port = new Serial(this, portname, 9600);
  println(Serial.list());
  //port.bufferUntil('\n');
}

void drawEllipse(float val)
{
  if(val > 0 && val < 50)
  {
    ellipseX = random(540,560); 
    ellipseY = random(390,410);
    ellipseW = val + 10;
    ellipseH = val + 10;

    stroke(0);
    fill(random(255), random(200,255));
  }
}

void drawLines(float val)
{
  if(val > 50 && val < 70)
  {
    lineX = random(500, 600);
    lineY = random(360, 440);
    lineXX = random(500, 600);
    lineYY = random(360, 440);

    stroke(0);
  }
}

void drawEllipse2(float val)
{
  if(val > 70 && val < 120)
  {
    ellipseXX = random(460, 640); 
    ellipseYY = random(330, 470);
    ellipseWW = val + random(20);
    ellipseHH = val + 10;

    stroke(0);
    fill(random(50, 100), random(50, 100), random(50, 100), random(220, 255));
  }
}

void serialEvent(Serial port) 
{
  String inString = port.readStringUntil('\n');

  if (inString != null)
  {
      val = Float.parseFloat(inString);
  }

  drawEllipse(val);
  drawLines(val);
  drawEllipse2(val);
  println(val);
}

共有1个答案

林鸿彩
2023-03-14

也许使用Serial.write()会更好。所以代码看起来像这样。

Arduino代码:

int ledPin = 13;      
int knockSensor = A0; 
byte val = 0;         
int statePin = LOW;   
int THRESHOLD = 5;  
int sensorReading = 0;

void setup() {
    pinMode(ledPin, OUTPUT); 
    Serial.begin(9600);       
}

void loop() {
    sensorReading = analogRead(knockSensor);    

    if(sensorReading > 0)
    {
        Serial.println(sensorReading, DEC);
    }

    if (sensorReading != 0)
        Serial.write(map(sensorReading, 0, 1023, 0, 255));
    delay(100);  
}

处理代码:

import processing.serial.*;

Serial port;

int centerX = 550;
int centerY = 400;

float val;
float ellipseX;
float ellipseY;
float ellipseW;
float ellipseH;
float ellipseXX;
float ellipseYY;
float ellipseWW;
float ellipseHH;
float lineX;
float lineY;
float lineXX;
float lineYY;

void setup(){
    background(255);
    size(1100,800); 
    frameRate(10);
    smooth();

    String portname = "/dev/tty.usbmodem1411"; 

    //String portname = Serial.list()[0];
    port = new Serial(this, portname, 9600);
    println(Serial.list());
    //port.bufferUntil('\n');
}

void drawEllipse(float val)
{
   if(val > 0 && val < 50)
   {
        ellipseX = random(540,560); 
        ellipseY = random(390,410);
        ellipseW = val + 10;
        ellipseH = val + 10;

        stroke(0);
        fill(random(255), random(200,255));
    }
}

void drawLines(float val)
{
    if(val > 50 && val < 70)
    {
        lineX = random(500, 600);
        lineY = random(360, 440);
        lineXX = random(500, 600);
        lineYY = random(360, 440);

        stroke(0);
    }
}

void drawEllipse2(float val)
{
    if(val > 70 && val < 120)
    {
        ellipseXX = random(460, 640); 
        ellipseYY = random(330, 470);
        ellipseWW = val + random(20);
        ellipseHH = val + 10;

        stroke(0);
        fill(random(50, 100), random(50, 100), random(50, 100), random(220, 255));
    }
}

void serialEvent(Serial port) 
{
    if (0 < port.available()) {
        val = map(port.read(), 0, 255, 0, 1023);
    }

    if (val > 0) {
        drawEllipse(val);
        drawLines(val);
        drawEllipse2(val);
        println(val);
    }
}
 类似资料:
  • 我想做的是从我用Arudino制作的转速表电路中读取连续的数据流,然后将其输入处理;我已经使用下面的代码成功完成了: 我不确定如何处理数据,以便每当检测到某个值时,处理中都会发生事件。 编辑:有人建议关闭,所以我的问题是调用是一个阻塞调用,这意味着中的指令指针将保持在。指针将调用和,但永远不会到达启动串行端口的线路 建议的解决方案是将这些行移动到的顶部,并将作为的最后一行。我尝试了这个(我下面的代

  • 我尝试做的是:Processing 3通过我的网络摄像头接收一种二维码-- 问题是:Processing 3和Unity都使用相同的端口(COM4,9600)。这将导致Unity中出现IO异常,表示“访问被拒绝”,随后出现串行端口未打开的错误。 处理3代码 Arduino代码 统一代码 我们显然无法在Unity中打开端口,因为它已经被处理3使用。如何解决这个问题?通信流: 最终,Unity需要根据

  • 我正在尝试使用arduino通过串行通信从泼妇软件获取传入数据。并将数据移动到其他12个arduino,如果我将泼妇的通道号保留为43,但我需要控制480个通道,它就可以工作。所以第一个arduino控制43个通道,下一个是44-87,依此类推。 这是我的主代码:'ulusetup(){Serial.begin(9600); }}//输出

  • 我遇到了一个非常简单的问题。 我正在尝试制作一个Qt GUI应用程序,以从GUI控制我的Arduino(而不是从Arduino IDE的串行监视器控制它)。我能够使用QSerialPort Write()方法成功地向Arduino写入,但我无法从Arduino读取任何内容。从串行端口读取数据的唯一方法是在Qt代码的waitForBytesWrite()中的write()函数之后使用waitForR

  • 我在一个项目中,我想通过串行通信发送传感器数据从Arduino到PHP。 不幸的是,我无法读取PHP中的串行端口。然而,另一个方向(PHP到Arduino)工作得很好。我使用的是php_系列。班来自Rémy Sanchez的php,由Rizwan Kassim修改。我依赖于readPort()函数。 我在Mac OS X上使用Arduino UNO和Apache WAMP-Server。我应该实现

  • 因此,我试图将一些用于操作LCD的代码从Arduino翻译为MSP430F5529的C。LCD使用SPI进行通信,我不清楚这段代码是如何使Arduino与之正确通信的,我希望有经验的人能够解释一些事情(我从未使用过)。最后我链接到了pastebin上的整个程序,但这是我现在关注的部分: 因此,我理解任何与将Arduino上的一些数字管脚设置为高或低有关的代码(看起来它们只是输出,因为程序从未为它们