envoi d'un mesage avec un en-tête et un corps sur un port série avec java


J'ai cherché haut et bas et je n'ai pas pu trouver de réponse à cette question. Je suis assez certain que ce n'est pas difficile, probablement un cas de mes recherches n'utilisant pas le bon verbiage.

Je travaille sur la communication avec un contrôleur de cardan. J'ai pu me connecter au port série auquel il est connecté. Je ne trouve pas d'informations sur la façon de formater un message comme celui-ci:

Chaque commande consiste de l'en-tête et du corps, tous deux avec somme de contrôle. Commandes avec le mauvais en-tête ou la somme de contrôle du corps, ou avec la taille du corps qui diffère de prévu, devrait être ignoré.

Quelqu'un Peut-il m'indiquer la direction sur la façon d'écrire sur le port série comme ça?

Merci,

Loren

Author: Loren Zimmer, 2015-11-11

1 answers

Il existe deux approches typiques pour communiquer avec un périphérique via un port série. Dans les deux cas, le résultat final est des bits bruts envoyés sur le fil. Vous pouvez envoyer des chaînes ASCII si votre appareil l'attend, mais puisque votre extrait a spécifiquement mentionné l'emballage de paquets, je me risquerais à dire qu'ils veulent des octets.

L'extrait que vous copiez collé semble provenir d'un manuel qui explique le protocole exact requis pour communiquer. En un mot, vous allez faire le suivant.

  1. Configuration du port série
  2. Préparez vos données en série
  3. Envoyer vos données en série

J'aime utiliser jSSC pour les communications série bien que beaucoup d'autres personnes utilisent RXTX. jSSC a été plus fiable pour moi, c'est donc ce que je vais utiliser dans mon exemple. Le manuel de votre appareil doit spécifier le débit en bauds requis, les bits de données, les bits d'arrêt, la parité et la prise de contact (le cas échéant).

Ici, nous configurons un port (remplacez vos paramètres au besoin). Voir les documents sur le les détails de cette. https://github.com/scream3r/java-simple-serial-connector

SerialPort _port = new SerialPort(portName);
_port .openPort();
_port.setParams(baudRate, dataBits, stopBits, parity, setRTS, setDTR);  
_port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

Pour construire votre paquet de données, vous devez savoir:

  1. Format d'en-tête
  2. Longueur requise / restrictions
  3. Méthode de somme de contrôle

Ici, je vais faire un super paquet simple qui est juste un exemple et n'est probablement pas applicable à votre cas d'utilisation.

// Format is: [length][7 data bytes][8 bit additive checksum]
// Create an empty byte array
byte[] packet = new byte[8];

// Our simple header
packet[0] = packet.length;

// Some data
byte[] dummyData = new byte[] { 1, 2, 3, 4, 5, 6, 7 };

// Copy data to packet
System.arraycopy(dummyData, 0, packet, 0, dummyData.length);

// Go do the checksum (good exercise for you)
byte checksum = getChecksum(packet);
packet[7] = checksum;

Donc maintenant nous avons un port, quelques données... et maintenant, quoi? Nous allons envoyer il.

// Just send those bytes
_port.writeBytes(packet);

Une fois que vous avez compris les choses, lisez comment vous lisez la réponse, configurez OnDataReceivedEvents et comment créer plus efficacement des paquets. Quelques bons termes pour Google:

  • jSSC
  • Java RXTX
  • Débit en bauds
  • Async/Sync traitement des données
 1
Author: cory.todd, 2015-11-11 23:50:23