2017-12-18 6 views
-1

Ich brauche serielle Signal von der Arduino-Platine in die Verarbeitung Skizze. Ich sende Werte im String-Format wie "R12" "S40" "T80", wenn ich diese Strings von der Verarbeitung abfinde, wird vertikal gedruckt (neue Zeile für jedes Zeichen) kann mir jemand sagen, wie man das als String bekommt, wie es ist wir sendeten. Ich brauche einen Code, der in die serialEvent-Methode der Verarbeitung eingefügt werden kann.Arduino - Verarbeitung der seriellen Kommunikation

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

Verarbeitung Code:

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

Ich brauche jeweils die R S T Variablen zuletzt empfangenen R S T-Werte zu erhalten.

Danke!

+2

einen Grund, warum Sie Ihren Arduino-Code als Snapshot bereitstellen? Bitte fügen Sie es als Text ein. Wo ist dein Bearbeitungscode? – Piglet

+0

gerade geändert! :) –

Antwort

2

Wie bereits erwähnt, ist es besser, den ganzen Code zu bekommen, um das Problem zu finden. Ich nehme an, Sie haben die Funktion "bufferUntil()" nicht in der Verarbeitung Setup hinzugefügt, so dass jedes Mal, wenn die serielle einen Wert erhalten, es nur anzeigen. Ich kann Ihnen eine Lösung vorschlagen, es ist nicht die einzige, aber es scheint zu funktionieren.

Auf Ihrem Arduino-Code sollten Sie anstelle von Serial.print() Serial.println() verwenden, um Ihre Nachricht zu trennen.

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

So werden Sie Nachricht als

Rxx 
Sxx 
Txx 

Bei der Verarbeitung senden, müssen Sie die Funktion "bufferUntil (lf)" verwenden. Es speichert alle Nachrichten von der seriellen Schnittstelle, bis es "/ n" erhalten hat. Danach sollten Sie eine andere Funktion verwenden, um Ihren Bezeichner mit dem Wert zu verknüpfen.

// 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; 
    } 
} 
+0

Das ist großartig, danke! –

Verwandte Themen