Bonjour à tous et happy coding
J'essaie actuellement de faire une interface de contrôle d'envoie de signaux radios, j'utilise donc pour ça un arduino avec virtualWire et pour choisir ce que j'envoie, une interface processing classique équipée de controlP5, ainsi que d'une console (plus pratique pour lire les dernières commandes). Hors, lorsque je lance processing -sur le bon com je précise que j'ai vérifié ceux-ci-... La communication se bloque au bout d'un moment. En cause, ceci :
StringIndexOutOfBoundsException: String index out of range: -1
Comment faire pour ne plus avoir cette erreur? Je sèche complètement là :'(
Je vous joint le code processing (arduino a la suite) :
/// cmd programme int TEST = 0; import processing.serial.*; import controlP5.*; Serial myPort; // Create object from Serial class String val = "_"; // Data received from the serial port String message; // Data received from the serial port ControlP5 cp5; Println console; Textarea myTextarea; void setup() { size(1920, 1080); cp5 = new ControlP5(this); frameRate(30); cp5.addBang("bang") .setPosition(250, 50) .setSize(20, 20) .setTriggerEvent(Bang.RELEASE) .setLabel("test") ; cp5.addBang("ClearConsole") .setPosition(20, 1010) .setSize(20, 20) .setTriggerEvent(Bang.RELEASE) .setLabel("Clear console") ; console(); if (TEST == 0) { String portName = Serial.list()[1]; //change the 0 to a 1 or 2 etc. to match your port myPort = new Serial(this, portName, 9600); myPort.bufferUntil('\n'); } } void draw() { if (TEST == 0) { if ( myPort.available() > 0) { // If data is available, val = myPort.readStringUntil('\n'); // read it and store it in val println("Mariner = " + val + " "); } else { //println("Not connected"); } } } public void bang() { println("boum"); send("bonjour"); } public void ClearConsole() { console.clear(); } void send(String sending) { if (TEST == 0) { myPort.write(sending); } println("Cmd == "+ sending); } // console.clear(); void console() { cp5 = new ControlP5(this); cp5.enableShortcuts(); myTextarea = cp5.addTextarea("Transmissions") .setPosition(0, 0) .setSize(200, 1000) .setFont(createFont("Overpass-Regular-14", 14)) .setLineHeight(14) .setColor(color(200)) .setColorBackground(color(50,50,50, 200)) .setColorForeground(color(255, 100)); console = cp5.addConsole(myTextarea);// }
Et le code arduino:
#include <VirtualWire.h> String val = "Radio waiting for orders"; void setup() { Serial.begin(9600); Serial.println("Radio connected"); vw_set_rx_pin(3); vw_set_tx_pin(13); vw_setup(1000); vw_rx_start(); } void loop() { Serial.println("Radio connected"); byte message[VW_MAX_MESSAGE_LEN]; byte taille_message = VW_MAX_MESSAGE_LEN; byte paquet[27]; if (Serial.available() > 0) { val = Serial.read(); strcpy(paquet, Serial.read()); vw_send(paquet, 27); vw_wait_tx(); Serial.print(val); Serial.println("....send"); } vw_wait_rx_max(1000); if (vw_get_message(message, &taille_message)) { Serial.println((char*) message); // Affiche le message } delay(10); }
Si vous avez la moindre idée, cela m'aiderait énormément :'(
Merci à tous et bonne journée.
Hors ligne
Bonsoir,
N'ayant pas d'Arduino sous la main, je ne peux que lancer des pistes.
Tu devrais préciser ton "Au bout d'un moment" c'est 3 heures iu quelques secondes ?
J'entrevois une possible erreur puisque tu utilises la méthode bufferUntil() à priori elle attends la méthode serialEvent() que tu aurais du implémenter. Cf doc
Je te conseille d'enlever l'instruction bufferUntil() et de regarder la doc de readStringUntil() pour l'initialisation.
L'autre solution serait de faire un test sur la chaîne pour ne pas quelle soit null.
A suivre
Bon courage
Hors ligne
Bonjour
J'ai réussi à régler le problème, il semblerait que cela venait de l'arduino dont je mes le code en dessous. J'ai ajouté ceci au début:
while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only }
De cette manière il ne s'active que quand processing ce connecte
Par contre, toujours pas de retour de message quand j'envoie une info à arduino, j'ai même essayé avec Serial.write("blablabla"); mais rien, n'y fait. Pourtant la led clignote quand j'envoie une info.
C'est à n'y rien comprendre.
voici le code de l'arduino pour aider ceux qui auraient le même pb de serial, et ceux qui pourrait m'apporter une réponse du pourquoi du comment la communication ne fonctionne pas :
#include <VirtualWire.h> String val ; void setup() { Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } vw_set_rx_pin(3); vw_set_tx_pin(13); vw_setup(1000); vw_rx_start(); } void loop() { Serial.println("Radio connecte! "); byte message[VW_MAX_MESSAGE_LEN]; byte taille_message = VW_MAX_MESSAGE_LEN; byte paquet[27]; while (Serial.read() > 0) { val = Serial.read(); strcpy(paquet, Serial.read()); vw_send(paquet, 27); vw_wait_tx(); Serial.write("send"); if (Serial.read() == "bonjour") { Serial.println("SALUT"); } } vw_wait_rx_max(1000); if (vw_get_message(message, &taille_message)) { Serial.println((char*) message); // Affiche le message } delay(100); }
Hors ligne
Bonjour a toi
quesce que tu cherche a faire ? 1 arduino qui communique avec un pc sans fil ou 2 arduino qui communique ensemble sans fil car la librarie virtualWire Cest surtout pour les communication sans fil
j'ai l'impression que tu mélange le serial et le virtualWire
Hors ligne
Je cherche à avoir deux arduino communicant par radio. Ce qui fonctionne déjà, mais processing permettrait d'envoyer des données détaillées, et de traiter les données reçues pour mettre le tout en 3D (déplacement de drone).
Donc en gros processing--->arduino qui envoie ensuite à un autre arduino.
La reception de données sera aussi traité.
Hors ligne
Ok et ma derniere question la communication entre le processing et le arduino echange til plusieurs variable a la fois ou 1 seul a la fois
Hors ligne
Seulement un String, jamais différentes variables à la fois.
Ce que je ne comprends pas c'est que j'avais utiliser exactement les même codes (que j'ai littéralement copié-collé) dans un autre programme et que cela fonctionnait parfaitement... J'ai aussi vérifié mes ports usb.
Hors ligne
voila j'ai ramener sa au base et il son d’ailleurs faite avec les exemples tu na plus qua adapter
Processing
/// cmd programme import processing.serial.*; import controlP5.*; Serial myPort; // Create object from Serial class ControlP5 cp5; Textarea myTextarea; Println console; String serialData; void setup() { size(displayWidth, displayHeight); cp5 = new ControlP5(this); cp5.enableShortcuts(); frameRate(50); myTextarea = cp5.addTextarea("Transmissions") .setPosition(0, 0) .setSize(200, displayHeight) .setFont(createFont("Overpass-Regular-14", 14)) .setLineHeight(14) .setColor(color(200)) .setColorBackground(color(50,50,50, 200)) .setColorForeground(color(255, 100)); ; console = cp5.addConsole(myTextarea); cp5.addBang("bang") .setPosition(250, 50) .setSize(20, 20) .setTriggerEvent(Bang.RELEASE) .setLabel("test") ; cp5.addBang("ClearConsole") .setPosition(250, 500) .setSize(20, 20) .setTriggerEvent(Bang.RELEASE) .setLabel("Clear console") ; String portName = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port myPort = new Serial(this, portName, 9600); } void draw() { background(100); if (myPort.available() > 0) { serialData = myPort.readStringUntil('\n'); if (serialData != null) { print("Arduino: "+ serialData); } serialData = ""; } } public void bang() { send("bonjour"); } public void ClearConsole() { console.clear(); } void send(String sending) { myPort.write(sending); println("Cmd: "+ sending); }
et Arduino
#include <VirtualWire.h> char serialCharData; void setup() { Serial.begin(9600); while (!Serial) {;} vw_set_rx_pin(3); vw_set_tx_pin(13); vw_setup(1000); vw_rx_start(); } void loop() { /* byte message[VW_MAX_MESSAGE_LEN]; byte taille_message = VW_MAX_MESSAGE_LEN; byte paquet[27]; vw_wait_rx_max(1000); if (vw_get_message(message, &taille_message)) { Serial.println((char*) message); // Affiche le message } delay(100);*/ } void serialEvent() { while (Serial.available()) { // get the new byte: String serialData = Serial.readString(); Serial.println(serialData); serialData = ""; /* char charBuf[serialData.length() + 1]; strcpy(serialCharData, Serial.read()); vw_send(serialCharData, charBuf); vw_wait_tx();*/ } }
Dernière modification par imdidi (2018-03-14 22:25:51)
Hors ligne
Woh, je ne m'attendais pas à tant d'aide °___°
Merci beaucoup, c'est vraiment génial, je fonce essayer
Si je comprends bien, il fallait simplifier le tout en somme?
Hors ligne
Toujours le même problème, ça m'étonne...
Je vais remplacer portName par COM7 et je verrais une fois la liaison avec mon ordi retrouvée...
(Je ne suis pas sur l'ordi en journée, j'utilise teamviewer, la connection vient d'être perdue)
Hors ligne
A tu changer le numero du port chez moi je lai changer poir 0 alors que toi cetait ecrit 1
String portName = Serial.list()[1];
Hors ligne
MERCI!!!!! cela fonctionne parfaitement
Hors ligne
Pages: 1