1
votes

Obtention de la valeur Garbage lors de la lecture du port série en Java

Je lis les données du port série en utilisant le package jSerialComm . Je reçois les données suivantes

entrez la description de l'image ici

Un total de 22 octets est reçu et je reçois également ces trois octets de déchets. Les données lisibles sont correctes, mais que se passe-t-il ces caractères inutiles?

Voici mon code.

public static void main(String[] args) {
    SerialPort serialPort = SerialPort.getCommPort("/dev/ttyUSB0");
    if(serialPort.openPort())
    {
        System.out.println("Port Opened Successfully...");
    }
    else
    {
        System.out.println("Unable to open port....");
        return;
    }
    serialPort.setComPortParameters(1200, 8, 1, 0);
    try
    {
        while(true)
        {
            while(serialPort.bytesAvailable() != 0)
            {
                Thread.sleep(1000);
                byte[] readBuffer = new byte[serialPort.bytesAvailable()];
                int numRead = serialPort.readBytes(readBuffer, readBuffer.length);
                String data = new String(readBuffer);
                System.out.println("Read "+numRead+ " bytes." + readBuffer);
                System.out.println(data);
            }
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    serialPort.closePort();
    System.out.println("done...");
}


5 commentaires

Êtes-vous sûr que les données que vous recevez sont censées être une chaîne? Il est plus probable qu'improbable que certaines données binaires doivent être traitées correctement.


Avez-vous joué avec différents débits en bauds?


le lien suivant pourrait vous donner une idée de arduino.stackexchange.com/a/71669


@Davio Je suis assez sûr des données et les données affichées dans la capture d'écran sont exactes, mais obtiennent également cette valeur de déchets.


@TahirHussainMir Baud rate et tout le reste va bien car j'obtiens les bonnes données mais avec la valeur des déchets ...


3 Réponses :


0
votes

Vous n'avez pas expliqué le protocole mais je suggère de le rechercher. Ce sont probablement des caractères de contrôle ou comme un commentaire suggère des données binaires. Vous créez une chaîne à partir d'un tampon d'octets sans encodage, donc cela dépend également de l'encodage par défaut de votre environnement / JVM.

Essayez de traiter le premier et les deux derniers octets comme spécifié dans le protocole utilisé pour votre projet. Cela peut également être lié au fait que jSerialComm ne supprime pas la signalisation série, par exemple la prise de contact, l'EOT, etc.

Si vous procédez à la rétro-ingénierie du protocole, essayez peut-être aussi une autre bibliothèque comme RxTx pour voir si les octets restent les mêmes.

Pour inspecter les octets en toute sécurité, utilisez par exemple BigInteger pour imprimer une chaîne hexadécimale à la place:

BigInteger bigInteger = new BigInteger(1, bytes);
System.out.printf("%0" + (bytes.length << 1) + "x", bigInteger);


2 commentaires

J'ai également vérifié le résultat en utilisant le module jssc . mais le résultat est le même ...


Donc, comme je l'ai recommandé, vérifiez les valeurs hexadécimales des octets avant et après. Il s'agit probablement de caractères de contrôle ou de caractères binaires selon le protocole de l'expéditeur. Si vous n'en avez pas besoin, déposez-les simplement.



1
votes

SerialPort.readBytes semble ne pas être thread-safe, produisant ainsi des "garbage" lorsqu'il est appelé pendant la réception de caractères.

Je suggère d'utiliser l' extrait de l'exemple de l'auteur qui a bien fonctionné pour moi:

// Get a new instance of SerialPort by opening a port.
SerialPort port = SerialPort.open("COM2");

// Configure the connection
port.setTimeout(100);
port.setConfig(BaudRate.B115200, Parity.NONE, StopBits.ONE, DataBits.B8);

// You have the choice, you can either use the Java NIO channels
// or classic Input/Ouput streams to read and write data.
//DEL SerialChannel channel = port.getChannel();
InputStream istream = port.getInputStream();

// Read some data using a stream
byte[] byteBuffer = new byte[4096];
// Will timeout after 100ms, returning 0 if no bytes were available.
int n = istream.read(byteBuffer);

// *** Use n bytes of byteBuffer ***

//DEL ...

port.close();

//DEL : supprimé du code d'origine pour plus de clarté


0 commentaires

0
votes

Utilisez ce bloc de code et il fonctionnera parfaitement;

    serialPort.addDataListener(new SerialPortDataListener() {
        @Override
        public int getListeningEvents() {
            return SerialPort.LISTENING_EVENT_DATA_RECEIVED;
        }

        @Override
        public void serialEvent(SerialPortEvent serialPortEvent) {
            if (serialPortEvent.getEventType() != SerialPort.LISTENING_EVENT_DATA_RECEIVED) {
                return;
            }
            byte[] newData = serialPortEvent.getReceivedData();
            String data = new String(newData);
            System.out.println(data);

        }
    });


0 commentaires