Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

techniken:datenaustausch:processingserialread

Mit Processing Daten von der Seriellen Schnittstelle empfangen

Genauso, wie ihr Ausgaben des Arduino im Serial-Monitor lesen könnt, kann auch ein beliebiges Programm auf eurem Computer diese Daten empfangen und verarbeiten.

Dazu muss euer Programm zunächst eine Verbindung über die Serielle Schnittstelle herstellen und dazu den Namen der Schnittstelle und die Baudrate angebnen. In Processing geht das mit der bereits vorinstallierten Serial Library (Dokumentation mit Beispielen zu allen Funktionen). Auf eurem PC gibt es auch vorinstallierte Beispiele unter (Examples/Libraries/Serial).

Beispielcode Processing: Serielle Verbindung herstellen und ankommende Daten ausgeben

import processing.serial.*;   //verwende die 'Serial' Library
 
Serial myPort;   // Deklariere ein Object vom Typ 'Serial', mit dem Namen 'myPort'
 
//stelle eine Verbindung zum Arduino her.
void setup() {
  // Um den Namen der Schnittstelle herauszufinden, lassen wir uns von der Serial-Klasse zunächst
  // eine Liste der Namen der am PC vorhandenen Ports geben ('Serial.list()')
  // Den x'ten Eintrag aus dieser Liste bekommen wir mit 'Serial.list()[x-1]' (die indices fangen mit 0 an)
 
  // Bei den meisten PCs ist der Arduino der letzte Port in der Liste.
  // Deshalb ermitteln wir zunächst die Länge der Liste (Serial.list().length) 
  // und nehmen uns den letzten Namen aus der Liste heraus (Serial.list()[Serial.list().length-1]) 
 
  String portName = Serial.list()[Serial.list().length-1]; // finde den Namen des letzten Serialports heraus.
  int baudrate=115200;       // Diese Baudrate muss mit der in eurem Arduinoprogramm übereinstimmen.
  //   String portName = "COM1"; // alternativ: verwende stattdessen einen bekannten Portnamen
  myPort = new Serial(this, portName, baudrate); // Erzeuge ein Serial Objekt und stelle eine Verbindung her
}
 
//Lese Daten und gib sie in Processing aus
void draw() {
  while (myPort.available() > 0) { // wiederhole das folgende, solange (while) es neue Daten (myPort.available() > 0)gibt.
    char inByte = myPort.readChar(); // lese einen einzelnen Buchstaben von der Seriellen Schnittstelle
    print(inByte); // gib den gelesenen Buchstaben im Fenster unter dem Code aus.
  }
}

Beispielcode Empfang von Zahlenwerten:

receiveDataSerial.pde
// This program shows how to read numbers in a human readable "ASCII" format from the Serial Port
// Created 2013 by Felix Bonowski
// This code is in the public Domain.
 
import processing.serial.*; //the functionality for using the Serial Port lies in a speical library. This tells Processing to use it.
Serial myPort;        // Create a "serial port" object/variable. "Serial" is the type of the object (just like "int"), "myPort" is the name of the variable
 
 
//this function gets called at the beginnign of the program
void setup () {
 
  // Initialze Serial communication. There may be multiple serial ports on your computer, so we have to select one:
  String[] portNames=Serial.list();//Serial.list() returns an array of port names   
  // if there is no serial port, quit with an error message
  if (portNames.length==0){throw(new IllegalStateException("There are no Serial ports on this computer!"));} 
  println(portNames);  //print them to the user
  // initialize the Serial port Object using the last name from the list and a Baudrate of 9600
  myPort = new Serial(this, portNames[portNames.length-1], 9600);
 
  // Set up the screen:
  size(1024, 512); // set size of the window
  background(0);// set  background color to black
  stroke(255); // set the color of things we draw to white
 
  // make the loop run as fast as it can so we dont loose any data
  frameRate(2000);
}
 
//this function is called continously, just as "loop" in arduino
void draw () {
  // get data from the Serial Port
  float[] data=readLineFromSerial(myPort);
 
  //check if data was received...
  if (data.length>0) {
    println( "\ngot fresh data!");
    }
 
  //or do something with all values:
  for(int i=0;i<data.length;i++){
    print(data[i]);
    print("\t");
  }  
 
}
 
 
//this function reads a line from the serial port and returns an array of numbers
//multiple numbers can be received if they separated by tab stops ("\t") 
float[] readLineFromSerial(Serial  port) {
  byte temp[] = port.readBytesUntil('\n'); //read data from buffer until a new line is finished
 
  // check if any data is available
  if (temp == null) {
    return new float[0]; //got nothing - return an empty array
  }   
  else {
    String inBuffer= new String(temp); //convert raw data to a string
    inBuffer=trim(inBuffer); //cut off whitespace
    float[] numbers=float(split(inBuffer, "\t")); //cut into pieces at tab-stops and convert to an array of floats
    return  numbers; //return the numbers we got
  }
}
techniken/datenaustausch/processingserialread.txt · Zuletzt geändert: 2016/11/16 13:49 von fbonowski