首页 文章

Arduino - 处理串行通信

提问于
浏览
-1

我需要从arduino板获取串行信号到处理草图 . 我正在以字符串格式发送值,如“R12”“S40”“T80”,当我从处理中捕获这些字符串时,它将垂直打印(每个字符的新行)任何人都可以告诉我如何将其作为字符串获取,因为它是我们发送 . 我需要一个可以放入处理内部的serialEvent方法的代码 .

Arduino Code :

void loop() {
  int r = random(10,100);
  int s = random(10,100);
  int t = random(10,100);
  Serial.print("R"+String(r));
  Serial.print("S"+String(s));
  Serial.print("T"+String(t));
  delay(1000);  
}

Processing Code :

String data = "";
int R,S,T;
void serialEvent(Serial p) {
  while(p.available()>0){
    data = p.readString();
  }
  println(data);
}

我需要将最后收到的R S T值分别输入到R S T变量中 .

谢谢!

1 回答

  • 2

    如前所述,最好让所有代码找到问题所在 . 我想你没有在处理设置中添加函数“bufferUntil()”,所以每次串口收到一个值时,它只显示它 . 我可以为你提出一个解决方案,它不是唯一的解决方案,但似乎有效 .

    在您的Arduino代码上,您应该使用Serial.println()来分隔您的消息,而不是Serial.print() .

    void setup() {
        Serial.begin(9600);
    }
    
    void loop() {
      int r = random(10,100);
      int s = random(10,100);
      int t = random(10,100);
      Serial.println("R"+String(r));
      Serial.println("S"+String(s));
      Serial.println("T"+String(t));
      delay(1000);  
    }
    

    所以你会发送消息为

    Rxx
    Sxx
    Txx
    

    在处理中,您必须使用函数“bufferUntil(lf)” . 它将保存来自串口的所有消息,直到收到“/ n” . 之后,您应该使用另一个函数将标识符与值相关联 .

    // Example by Tom Igoe 
    import processing.serial.*;
    Serial myPort;    // The serial port
    PFont myFont;     // The display font
    String inString;  // Input string from serial port
    int lf = 10;      // ASCII linefeed 
    
    String data = "";
    int R,S,T;
    
    void setup() { 
      size(400,200); 
      // List all the available serial ports: 
      printArray(Serial.list()); 
      // Open whatever port is the one you're using, mine is one. 
      myPort = new Serial(this, Serial.list()[1], 9600); 
      myPort.bufferUntil(lf);                            //delimiter of serial buffer end line                         
    } 
    
    void draw() { 
      background(0); 
      text("received: "+" R="+R+"  S="+S+"  T="+T, 10,50); //Display value on the window
    } 
    
    void serialEvent(Serial p) {
      while(p.available()>0){
        String buf=p.readString();                //Read serial input
        println(buf);
        if(!buf.equals('\n'))                       //delete null='/n' from arduino println()
          data=buf;                                 //Save buffer
      }
      /*char id=data.charAt(0);                      //Get id from buffer
      int value=parseInt(data.substring(1,3));     //Get the value from buffer
      identifyVariable(id,value);                  //Associate id and value*/
    } 
    
    void identifyVariable(char ID, int value){
      switch(ID){            //associate id with value 
        case('R'):
          R=value;
          break;
        case('S'):
          S=value;
          break;
        case('T'):
          T=value;
          break;
        default:
          println("error "+ID+" "+value );
          break;
      }
    }
    

相关问题