Go Down

Topic: Processing to arduino - virtualWire (HELP) (Read 476 times) previous topic - next topic

Marsat

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 faite avec la librairy controlP5, ainsi que d'une console (plus pratique pour lire les dernières commandes envoyée ou reçue).
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, ou pouvez vous me l'expliquer? Je crois ne pas avoir très bien compris les sites et solutions proposées.  Je sèche complètement là.
:'(

Je vous joint le code processing (arduino à la suite) :
Code: [Select]
/// 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:

Code: [Select]
#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.

dfgh

hello

la chaine que tu envoies avec arduino se termine bien par" /n"

car processing l'attend pour considérer la réception terminée

val = myPort.readStringUntil('\n');

Marsat

Ha... je ne l'avais effectivement pas fait, je fonce tester cela ^^

Merci beaucoup!!!!

Marsat

Heu, c'est surtout une valeur nulle impossible à afficher en fait non...?

dfgh

selon le message d'erreur que tu as posté?

StringIndexOutOfBoundsException: String index out of range: -1

Marsat

Bonsoir
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 :
Code: [Select]

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 :'( :

Si vous avez une réponse, je serais ravis d'avoir un peu d'aide T.T

Code: [Select]
#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);
}

Marsat

Cela pourrait-il être un pb avec la librairy virtualWire...?

Je l'ai désactivée et rien.

Pourtant avec ctrl+Maj+M tout fonctionne, y compris l'envoie et la réception de données.

jfs

#7
Mar 14, 2018, 09:15 am Last Edit: Mar 14, 2018, 09:15 am by jfs
J'avais eu des soucis du même style avec readStringUntil()

Essaye avec cette fonction :

https://www.processing.org/reference/libraries/serial/Serial_bufferUntil_.html
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Marsat

J'ai réussi à régler ce problème en ajoutant au programme arduino :)

while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


Maintenant la question est l'absence de retour d'information de la part d'arduino VERS processing :/



Marsat

Quelqu'un aurait une idée du problème, j'ai beau chercher, rien ne se passe :/

Go Up