Skip to content

Instantly share code, notes, and snippets.

@HorlogeSkynet
Last active June 3, 2021 14:11
Show Gist options
  • Save HorlogeSkynet/d8ccc372afa7febb04a5 to your computer and use it in GitHub Desktop.
Save HorlogeSkynet/d8ccc372afa7febb04a5 to your computer and use it in GitHub Desktop.
Get data from Arduino with serial port on Processing
/* Programme nécessaire, et donc réalisé, dans le but de modéliser un projet TIPE */
/* Année scolaire 2015 - 2016 */
import processing.serial.*;
int indArduino;
Serial portSerie;
void setup()
{
/* ... */
//On assigne '-1' pour forçer l'exception de 'checkArduino()', et donc l'appel de 'connectArduino()' à la première itération
indArduino = -1;
//On crée le thread qui gèrera la fermeture de fenêtre
prepareExitHandler();
/* ... */
}
void draw()
{
/* ... */
getData();
/* ... */
}
void getData()
{
//On vérifie si l'Arduino est toujours branchée
checkArduino();
//On lit les données jusqu'au caractère de fin de buffer (choix personnel)
String string = portSerie.readStringUntil('\n');
if(string != null)
{
//On efface les ' ' eventuels présents aux extrémités de la chaîne
string = trim(string);
//Déformatage des données, récupérées sous forme d'une chaîne de caractères
int data[] = int(split(string, ':')); //Avec ':' caractère de délimitation entre les données
if(data != null)
{
/* Traitement des données, présentes dans le tableau 'data[]' */
}
}
}
private void prepareExitHandler()
{
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
{
public void run()
{
try
{
closeSerial();
}
catch(Exception e)
{
//La fonction 'closeSerial()' n'a peut-être pas pu être exécutée correctement
}
}
}));
}
void connectArduino()
{
int i;
String string;
String listePorts[];
while(true)
{
println("En attente d'une connexion avec l'Arduino...");
listePorts = Serial.list();
if(listePorts != null)
{
//On parcourt la boucle à l'envers car l'Arduino a sûrement été branchée en dernier
for(i = listePorts.length - 1; i >= 0; i--)
{
string = listePorts[i];
//On vérifie si la chaîne contient les caractéristiques d'un périphérique série...
//... pour chaque OS (Linux || MAC OS || Windows)
if(string.indexOf("USB") >= 0 || string.indexOf("usbserial") >= 0 || string.indexOf("COM") >= 0)
{
//On essaie de créer un objet gérant le dialogue avec le port série
portSerie = new Serial(this, listePorts[i], 9600);
//On nettoie le port série
portSerie.clear();
//On lit la chaîne potentiellement présente
string = portSerie.readStringUntil('\n');
//Si elle comporte les caractères spécifiques du buffer fixés sur l'Arduino
if(string != null && string.indexOf('\n') > 0 && string.indexOf(':') > 0)
{
//On fixe l'indice de l'élément choisi dans le tableau
indArduino = i;
println("Arduino connectée.");
return;
}
//Sinon, le périphérique auquel on s'est connecté n'est pas l'Arduino
else
{
stop();
continue;
}
}
}
}
delay(1500);
}
}
void checkArduino()
{
try
{
//On tente d'accéder à l'élément du tableau à la position 'indArduino' fixée plus haut
String string = Serial.list()[indArduino];
//Pour éviter un Warning de Processing...
string = trim(string);
}
//On vérifie à l'aide d'une exception si l'on peut toujours accéder à cet élément dans le tableau...
catch(ArrayIndexOutOfBoundsException e)
{
println("Arduino déconnectée.");
closeSerial();
//... si tel n'est pas le cas, on tente une (re)connexion avec l'Arduino
connectArduino();
}
}
void closeSerial()
{
if(portSerie != null)
{
portSerie.clear();
portSerie.stop();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment