处理读取串行错误

Processing Read Serial Error

arduino代码读取rfid标签[RFIDreader为ID-12],与Tag1Tag2比较,若相等则发送Serial Port 1 or 2,这个值是播放song1或者song2的处理读取的。

Arduino代码:

/*
Documentazione: http://www.logicaprogrammabile.it/arduino-leggere-tag-rfid-id-12/

*/

byte datarfid[16];
byte i = 0;
int LD1 = 8;
int LD2 = 6;

String tag ="";

void setup()
{
//init seriale a 9600 bps
  pinMode(LD1, OUTPUT);
  pinMode(LD2, OUTPUT);
  Serial.begin(9600);

}

void loop()
{
  digitalWrite(LD1, LOW);
  digitalWrite(LD2, LOW);   
  //attendo la presenza di tutti e 16 byte provenienti
  //dal lettore id-12
  if(Serial.available() >= 16)
  {
    //leggo ogni byte e lo memorizo nell’array
    //precedentemente definito
    for(i = 0; i <= 15; i++)
    {
      datarfid[i] = Serial.read();
    }

    //ora ricavo i 10 byte che compongono il codice del tag
    //e li concateno in un ogetto stringa
    //da notare la conversione dei byte in char
    for(i = 1; i <= 10; i++)
    {
      //concateno la stringa convertendo i byte in char
      tag += (char)datarfid[i];
    }

    //ora verifico se il codice del tag corrisponde
    //a quello memorizzato nel sistema
    if(tag == "0107EB826F"){
      /*
      Serial.print("Song");
      Serial.print(":");
      */
      Serial.println(1);
      digitalWrite(LD1, HIGH);   
      delay(500);              
      digitalWrite(LD1, LOW);

    }
    else if (tag == "0F0002F973"){
      /*
      Serial.print("Song");
      Serial.print(:");
      */
      Serial.println(2);
      digitalWrite(LD1, HIGH);   
      delay(500);              
      digitalWrite(LD1, LOW);
    }      
    else
    {
      Serial.print(0);
      digitalWrite(LD2, HIGH);   
      delay(500);              
      digitalWrite(LD2, LOW);
    }
    tag="";
  }
}

处理代码:

    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import ddf.minim.effects.*;
    import ddf.minim.signals.*;
    import ddf.minim.spi.*;
    import ddf.minim.ugens.*;

    import processing.serial.*;
    Minim minim;

    Serial myPort;
     String Tag1;
     String Tag2;
     String inString;

     int lf = 10;



    //this is the object that plays your file
    AudioPlayer player;
    AudioPlayer player2;

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

      //initialize minim
      minim = new Minim(this);
     player=minim.loadFile("Song1.mp3");
     player2=minim.loadFile("Song2.mp3");

      // List all the available serial ports:
      println(Serial.list());
      // Open the port you are using at the rate you want:
      myPort = new Serial(this, Serial.list()[0], 9600);
      myPort.bufferUntil(lf);

      Tag1="1";
      Tag2="2";



    }

    void draw()
    {
     background(0);

     text("Ricevuto:" +inString, 10, 50);



    if (inString!=null){


      if (inString==Tag1)
      {
        text("Song 1",10,80);
        player.play();
      }

      if (inString==Tag2)
      {
        text("Song 2",10,100);
        player2.play();
      }
    }
  }

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

    }


    void mousePressed()
    {
      //it's weird but you have to rewind a file to play it
      player.rewind();
      player.play();
    }

当我尝试在 if 条件下将 inString 与另一个字符串进行比较时,它不会这样做,也不会将 inString 复制到另一个字符串

处理文档说 you cannot compare strings using the == operator, although you can do it with arduino

例如,您应该将 if (inString==Tag1) 替换为 if (inString.equals(Tag1) == true)

您快完成了,但在字符串比较方面有点偏差。

  1. 比较 Java/Processing 中的字符串。使用 use String 的 equals() method (or equalsIgnoreCase() )
  2. 更安全
  3. 当您从 Arduino 发送 Serial.println(2); 时,您发送的是数字 2,而不是字符 '2'(它们没有相同的值,请尝试 println(2 == '2');。使用 println() 时,可能还需要使用 trim()
  4. 删除任何多余的空格(spaces/tabs/new line/carriage return/etc)

尝试在处理中使用类似这样的东西:

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

    }

然后

if (inString.equals(Tag1))
      {
        text("Song 1",10,80);
        player.play();
      }

      if (inString.equals(Tag2))
      {
        text("Song 2",10,100);
        player2.play();
      }

如果歌曲一遍又一遍地开始播放(因为在 Arduino 发送另一条消息之前播放歌曲的条件为真),您可能需要使用布尔变量来跟踪歌曲是否开始播放. AudioPlayer 已经以 isPlaying():

的形式提供了一些东西
if (inString.equals(Tag1))
          {
            text("Song 1",10,80);
            if(!player.isPlaying()) player.play();
          }

          if (inString.equals(Tag2))
          {
            text("Song 2",10,100);
            if(!player2.isPlaying()) player2.play();
          }