Question

Je suis en train de communiquer entre mon PC (Windows 7 en utilisant Netbeans et RXTX) avec un Arduino Pro, en utilisant le port série. L'Arduino est en fait connecté au PC via un câble FTDI.

Le code est basé sur Java SimpleRead.Java trouvé ici.

Actuellement, l'Arduino affiche simplement une chaîne lors de son démarrage. Mon programme Java doit imprimer le nombre d'octets qui ont été lus et imprimer le contenu. Les travaux du programme Java, sorte de ...

Si la chaîne est longue (> 10 octets environ) la sortie se fragmentent.

Donc, si sur l'impression Arduino I

Serial.println("123456789123456789"); //20 bytes including '\r' and '\n'

La sortie de mon programme Java peut ressembler à:

Number of Bytes: 15   
1234567891234  
Number of Bytes: 5  
56789

ou

Number of Bytes: 12   
1234567891  
Number of Bytes: 8  
23456789

Je pense qu'il ya un problème de timing, parce que quand je vais manuellement via le code en utilisant le débogueur, la chaîne de résultat est toujours ce qu'elle devrait être:. Une chaîne de 20 octets

J'ai été déconner avec diverses choses, mais je ne l'ai pas été en mesure de résoudre le problème.

Voici la partie du code qui me donne des problèmes:

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");
    }
}
Était-ce utile?

La solution

Les données en série est juste un flux de données. Selon le moment où vous lisez et la mise en mémoire tampon qui se passe, seule une partie des données peut être disponible quand vous le lisez.

Puisque vous utilisez des données axées sur la ligne, ce que vous voulez faire est de mémoire tampon les données jusqu'à ce que la terminaison de ligne et seulement ensuite traiter les données.

Autres conseils

Je ne l'ai pas utilisé Java RXTX, mais je l'ai joué avec Arduino et le traitement et il est assez facile à lire / valeurs d'écriture à partir Arduino. Voici un exemple de lecture qui vient avec le traitement (Fichier> Exemples> Bibliothèques> Série> SimpleRead)

/**
 * Simple Read
 * 
 * Read data from the serial port and change the color of a rectangle
 * when a switch connected to a Wiring or Arduino board is pressed and released.
 * This example works with the Wiring / Arduino program that follows below.
 */


import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;      // Data received from the serial port

void setup() 
{
  size(200, 200);
  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}

void draw()
{
  if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();         // read it and store it in val
  }
  background(255);             // Set background to white
  if (val == 0) {              // If the serial value is 0,
    fill(0);                   // set fill to black
  } 
  else {                       // If the serial value is not 0,
    fill(204);                 // set fill to light gray
  }
  rect(50, 50, 100, 100);
}



/*

// Wiring / Arduino Code
// Code for sensing a switch status and writing the value to the serial port.

int switchPin = 4;                       // Switch connected to pin 4

void setup() {
  pinMode(switchPin, INPUT);             // Set pin 0 as an input
  Serial.begin(9600);                    // Start serial communication at 9600 bps
}

void loop() {
  if (digitalRead(switchPin) == HIGH) {  // If switch is ON,
    Serial.print(1, BYTE);               // send 1 to Processing
  } else {                               // If the switch is not ON,
    Serial.print(0, BYTE);               // send 0 to Processing
  }
  delay(100);                            // Wait 100 milliseconds
}

*/

Pour autant que je me rappelle, la transmission que vous Thingy dans la configuration Arduino lorsque vous instancier série est assez important. Si vous utilisez 9600 pour envoyer par exemple, vous devez utiliser le même numéro pour écouter.

En outre, il est très important d'envoyer vos informations BYTE , sinon vous aurez des choses comme \ r ou \ n de la manière.

version écourtée, essayez:

Serial.println(123456789123456789,BYTE);

Le plus simple est le mieux.

Je pense que vous devez utiliser des modèles de conception événementielles pour résoudre ce problème. Je vous recommande fortement de visiter: http: //www.whatisarduino. org / bin / Tutorials / Java + série + API + et + Arduino

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top