12
votes

Communication série entre Java RxtX et Arduino

J'essaie de communiquer entre mon PC (Windows 7 à l'aide de Netbeans et RxTX) avec ARDUINO PRO, à l'aide du port série. L'Arduino est en fait connecté au PC à l'aide d'un câble FTDI.

Le code est basé sur la Java SimpleAread.java trouvée ici. p>

Actuellement, l'Arduino imprime simplement une chaîne lorsqu'elle démarre. Mon programme Java devrait imprimer le nombre d'octets qui ont été lus, puis imprimez le contenu. Le programme Java fonctionne, en quelque sorte ... p>

si la chaîne est longue (> 10 octets ou plus), la sortie sera brisée. P>

donc si sur l'Arduino I Imprimer P>

static int baudrate = 9600,
           dataBits = SerialPort.DATABITS_8,
           stopBits = SerialPort.STOPBITS_1,
           parity   = SerialPort.PARITY_NONE;    

byte[] readBuffer = new byte[128];

...
...

public void serialEvent(SerialPortEvent event)
{
   if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

    try {
        if (input.available() > 0) { 
            //Read the InputStream and return the number of bytes read
            numBytes = input.read(readBuffer);

            String result  = new String(readBuffer,0,numBytes);
            System.out.println("Number of Bytes: " + numBytes);
            System.out.println(result);
        }
    } catch (IOException e) {
        System.out.println("Data Available Exception");
    }
}


0 commentaires

3 Réponses :


7
votes

Les données série ne sont qu'un flux de données. En fonction de la lecture de la lecture et du tampon qui se passe, seule une partie des données peut être disponible lorsque vous le lisez.

Étant donné que vous utilisez des données orientées en ligne, ce que vous voudrez faire est de tamponner les données jusqu'à ce que vous voyiez le terminateur de ligne et que ne traitez que les données.


2 commentaires

Pour une raison quelconque, j'ai supposé que les données seraient envoyées contiguës dans un seul flux. Sur la partie PC, je n'ai besoin que de voir la sortie série. Je ne pense donc pas que je m'empêcherai d'essayer de stocker la ligne entrante complète, puis de l'afficher. Je pense que je vais simplement afficher l'octet d'octet de données tel qu'il est entré. Alors je vais utiliser Abyte = Input.Lead (); au lieu de l'entrée.Lead (Readbuffer); Merci


@Sharpbarb - Pas besoin de passer à la lecture d'un octet à la fois. Si vous voulez vraiment faire cela, je vous recommanderais de lire un tampon, puis de votre application, faites simplement traiter chaque octet séparément.



3
votes

Je n'ai pas utilisé Java RxtX, mais j'ai joué avec Arduino et Traitement et il est assez facile de lire / écrire des valeurs d'Arduino. Voici un échantillon de lecture fourni avec le traitement (fichier> Exemples> Bibliothèques> Serial> SimpleRead)

Serial.println(123456789123456789,BYTE);


3 commentaires

Salut, peut traiter des travaux sans paplettes? Parce que j'essaie d'intégrer mon code Java ...


Merci pour la réponse, @geory laissez-vous dire que je veux obtenir une entrée analogique d'Arduino et l'Arduino répondra à la valeur analogique chaque fois que j'envoie quelque chose à Arduino. Selon le code dans le lien, il suffira d'imprimer la chose au lieu de l'enregistrer dans une variable, comment puis-je stocker le chuck à une variable? Parce que le vidange synchronisé public ne peut pas renverser la valeur, je pense ...


@wizztjh ceci en haut de ma tête, mais vous avez ce bit de code: Byte Chunk [] = nouvel octet [disponible]; Input.Lead (Chunk, 0, Disponible); ... Après cela, la date est stockée en octet, vous devriez pouvoir rendre la variable du morceau visible pour la classe, pas seulement ce bloc. Si nouveau besoin d'une chaîne, vous pouvez créer une variable de classe et définit sa valeur pour être une nouvelle chaîne (chunk) après la partie INPUT.Lead. Ht



1
votes

Je pense que vous devez utiliser des modèles de conception entraînés pour résoudre ce problème. Je vous recommande vivement de visiter: http: //www.whatisarduino. Org / bin / Tutoriels / Java + Serial + API + et + Arduino


0 commentaires