Arduino - 处理串行通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino - 处理串行通信相关的知识,希望对你有一定的参考价值。

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

Arduino代码:

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);  
}

处理代码:

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变量。

谢谢!

答案

如前所述,最好让所有代码找到问题所在。我想你没有在处理设置中添加函数“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('
'))                       //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;
  }
}

以上是关于Arduino - 处理串行通信的主要内容,如果未能解决你的问题,请参考以下文章

从 php 到 arduino 的串行通信

Arduino和Python之间的串行通信发送/接收数据

串行通信后Arduino一直在重启。

Arduino/AVR:中断串行/I2C 通信是不是安全

使用串行通信在 python 和 arduino 之间进行同步

Arduino Uno Raspberry Pi 串行通信双读数