Arduino与Processing的串行通信问题

时间:2016-01-17 19:01:24

标签: arduino processing

我试图在Ardunio上的传感器之间创建数据交换(实际上是基于面包板的基于AtMega328PU的克隆,但我不相信这是我的问题的根源)和一个Processing脚本,我得到了一些意想不到的结果。我正在遵循详细的here串行通信方法,但我似乎不知道实际上没有数据通过串行连接传输。

Arduino代码:

int buttonPin = 9, photodiodePin = A0;
char dataToSend;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, OUTPUT);
  pinMode(photodiodePin, INPUT);
}

void loop() {  
  if (Serial.available() > 0)
  {
    dataToSend = Serial.read();    

    if (dataToSend == 'B')
    {
      Serial.println(digitalRead(buttonPin));
    }
    else if (dataToSend == 'L')
    {
      Serial.println(analogRead(photodiodePin));
    }
  }
}

处理代码的相关部分:

import processing.serial.*;

Serial myPort;

void setup()
{
 size(1600,900);

 String portName = Serial.list()[1];
 myPort = new Serial(this, portName, 9600);
}

void draw()
{
  if(getButtonData() == 1)
  {
    //Do Stuff
  }
}

int getLightData()
{
  myPort.write('L');
  println("L");
  while(!(myPort.available() > 0)){
  }
  int lightValue = int(myPort.readStringUntil('\n'));
  return lightValue;
}

int getButtonData()
{
  myPort.write('B');
  println("B");
  while(!(myPort.available() > 0)){
    println("stuck in here");
    delay(500);
  }
  int buttonValue = int(myPort.readStringUntil('\n'));
  return buttonValue;
}

在Processing中,我得到一个输出:

B
stuck in here
stuck in here
stuck in here
stuck in here
...

注意:我知道我从列表中选择了正确的端口,所以这不是问题。

我已尝试调试此问题并在互联网上搜索类似问题,但都无济于事。非常感谢您对此问题的任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

我首先检查是否只是从Arduino发送一条简单的消息到Processing工作。在Arduino中尝试这样的事情:

import processing.serial.*;


Serial arduino;
void setup(){
  String portName = Serial.list()[1];
  try{
    arduino = new Serial(this, portName, 9600);
    arduino.bufferUntil('\n');
  }catch(Exception e){
    System.err.println("Error initializing Serial port!\nPlease check connections and port settings");
    e.printStackTrace();
  }
}
void draw(){

}
void serialEvent(Serial s){
  println("received arduino message: " + s.readString());
}

和处理中的这个:

serialEvent()

如果这个简单的设置有效,你可以继续进行下一步并进行双向通信。如果以上情况不起作用,那么还有一些其他问题导致串行通信出现问题(在这种情况下,请报告您正在接收的错误,如果有任何或您正在经历的行为)< / p>

如果上述情况有效,您可以尝试双向通信。请注意,我正在使用bufferUntilint buttonPin = 9, photodiodePin = A0; char dataToSend; void setup() { Serial.begin(9600); pinMode(buttonPin, OUTPUT); pinMode(photodiodePin, INPUT); } void loop() { } void serialEvent(){ if(Serial.available() > 0){ char cmd = Serial.read(); if(cmd == 'B'){ Serial.println(digitalRead(buttonPin)); } if(cmd == 'L'){ Serial.println(analogRead(photodiodePin)); } } } 。尽可能避免阻塞while循环。

Arduino代码:

import processing.serial.*;


Serial arduino;

int digitalValue;
int analogValue;

int lastCMD;

void setup(){
  size(200,100);
  String portName = Serial.list()[1];
  try{
    arduino = new Serial(this, portName, 9600);
    arduino.bufferUntil('\n');
  }catch(Exception e){
    System.err.println("Error initializing Serial port!\nPlease check connections and port settings");
    e.printStackTrace();
  }
}
void draw(){
  background(0);
  text("Press 'B' to read digital pin\nPress 'L' to read analog pin\n\n"+
       "digital pin: " + digitalValue + "\nanalog pin: " + analogValue,10,25);
}
void keyReleased(){
  if(key == 'B' || key == 'L'){
    lastCMD = key;
    println("sending command" + lastCMD);

    if(arduino != null){
      arduino.write(lastCMD);
    }else println("Arduino is not initializing, not writing to serial port");
  } 
}
void serialEvent(Serial s){
  String rawString = s.readString();
  println("received arduino message" + rawString);
  try{
    rawString = rawString.trim();//remove any white space characters (if present)
    if(lastCMD == 'B') digitalValue = int(rawString);
    if(lastCMD == 'L') analogValue  = int(rawString);
  }catch(Exception e){
    println("Error parsing String from serial port:");
    e.printStackTrace();
  }

}

处理代码:

{{1}}