Des problèmes de réception dans RXTX
J'ai été en utilisant RXTX pour environ un an maintenant, sans trop de problèmes. Je viens de commencer un nouveau programme d'interagir avec un nouveau morceau de matériel, donc j'ai réutilisé la méthode connect() je l'ai utilisé sur mes autres projets, mais j'ai un problème bizarre je n'ai jamais vu avant.
Le Problème
L'appareil fonctionne très bien, parce que lorsque je me connecte avec HyperTerminal, j'ai envoyer et de recevoir ce que j'attends, et Serial Port Monitor(SPM) est le reflet.
Cependant, lorsque je lance le simple HyperTerminal-clone que j'ai écrit pour diagnostiquer le problème, je vais avoir avec mon application principale, les octets sont envoyés, selon SPM, mais rien n'est reçu, et mon SerialPortEventListener se déclenche jamais. Même quand je vérifier la disponibilité de données dans la boucle principale, reader.ready()
retourne false
. Si je ignorer cette case, puis-je obtenir une exception, les détails ci-dessous.
Section pertinente de la méthode connect ()
//Configure and open port
port = (SerialPort) CommPortIdentifier.getPortIdentifier(name)
.open(owner,1000)
port.setSerialPortParams(baud, databits, stopbits, parity);
port.setFlowControlMode(fc_mode);
final BufferedReader br = new BufferedReader(
new InputStreamReader(
port.getInputStream(),
"US-ASCII"));
//Add listener to print received characters to screen
port.addEventListener(new SerialPortEventListener(){
public void serialEvent(SerialPortEvent ev) {
try {
System.out.println("Received: "+br.readLine());
} catch (IOException e) { e.printStackTrace(); }
}
});
port.notifyOnDataAvailable();
Exception
java.io.IOException: Underlying input stream returned zero bytes
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.read(BufferedReader.java:157)
at <my code>
La grande question (encore une fois)
Je pense que j'ai éliminé tous les problèmes matériels possibles, de sorte que ce qui pourrait être mal avec mon code, ou le RXTX bibliothèque?
Edit: quelque chose d'intéressant
Quand j'ouvre HyperTerminal après l'envoi d'un tas de commandes à partir de java qui aurait obtenu de réponses, toutes les réponses s'affichent immédiatement, comme s'ils avaient été mis dans le tampon quelque part, mais pas disponible.
Edit 2: je l'ai Essayé quelque chose de nouveau, les mêmes résultats
J'ai couru l'exemple de code trouvé ici, avec les mêmes résultats. Aucune donnée n'est venu, mais quand je suis passé à un nouveau programme, il est venu tout à la fois.
Modifier 3
Le matériel est très bien, et même un autre ordinateur a le même problème. Je ne suis pas à l'aide de l'adaptateur USB.
J'ai commencé à utiliser PortMon, trop, et c'est me donner quelques résultats intéressants. HyperTerminal et RXTX ne sont pas en utilisant les mêmes paramètres, et RXTX toujours sondages le port, à la différence de l'HyperTerminal, mais je ne vois toujours pas quels sont les paramètres qui pourraient affecter ce. Dès que je peux isoler la configuration à partir de la constante d'interrogation, je vais poster mon PortMon journaux.
Edition 4
Est-il possible qu'une certaine sorte de mise à jour de Windows dans les 3 derniers mois pourrait avoir causé cela? Il a foutu un de mes MATLAB mex programmes basés sur une fois.
Modifier 5
J'ai aussi remarqué certaines choses qui sont différentes entre HyperTerminal, RXTX, et d'un autre programme que j'ai trouvé qui communique avec l'appareil (mais ne pas faire ce que je veux, c'est pourquoi je continue mon propre programme)
- HyperTerminal - définissez pas de contrôle de flux, mais Serial Port Monitor de la RTS et DTR indicateurs sont au vert
- Autre programme ne savez pas quels paramètres il pense que c'est à l'aide, mais seulement de SPM RTS indicateur est vert
- RXTX, peu importe ce que le contrôle de flux-je mettre, seulement de SPM CTS et DTR indicateurs sont sur.
De Serial Port Monitor fichiers d'aide (paraphrasé):
the indicators display the state of the serial control lines
RTS - Request To Send
CTS - Clear To Send
DTR - Data Terminal Ready
OriginalL'auteur Nate Parsons | 2009-09-08
Vous devez vous connecter pour publier un commentaire.
OK, désolé d'avoir pris autant de temps pour revenir à cette question. Voici comment j'ai obtenu les choses de travail.
Note: Cette méthode PAS de travail pour tout le monde, veuillez lire ci-dessous avant de les copier/coller dans votre propre code
Donc, dans mon cas, le problème était que mon appareil nécessite RTS de contrôle de flux. D'autres appareils peuvent nécessiter différentes choses (CTS, XON/XOFF), afin de vérifier que le manuel du périphérique. Par défaut, RXTX désactive tous les flux de mécanismes de contrôle (à la différence de Hypertrm ou d'autres programmes). Permettant à chacun est un processus en deux étapes.
setFlowControlMode()
méthode, et bit à bit OU ('|
') de la nécessaireSerialPort.FLOWCONTROL_
constantesport.setRTS(true)
)Pour les autres, avec des problèmes similaires, si cela ne fonctionne pas, je vous suggère de
Nous espérons que cette édition permet de
Je vois comment vous définissez flowcontrol sur votre serialport objet. C'est clair. Cependant, je suis à essayer de comprendre comment vous constatez que le contrôle de flux de caractères a été envoyé? Je suis à l'aide de XON XOFF vs RTS comme vous étiez. Cependant je suppose qu'il devrait être similaire. 0x13,0x11 sont les personnages je m'attends à voir dans le serialEvent que les feux? Comment avez-vous été en mesure de détecter dans le code?
Je ne me souviens pas avoir déjà vu le flux de caractères de contrôle. Dans Serial Port Monitor ou PortMon (liens dans la réponse) j'ai vu un ensemble de rouge et de vert cercles dans la partie inférieure droite de la fenêtre, et l'un d'eux a été CTS, et un autre XON/XOFF. Lorsque les choses se passaient, ils étaient verts. Sinon, ils étaient rouges.
Oh Merci beaucoup pour la solution dans le détail. J'ai passé deux jours entiers dans le débogage, mais je l'ai enfin maintenant avoir un correctif.
OriginalL'auteur Nate Parsons
Il y a une solution simple à ce problème. C'est ce que j'ai fait:
Si vous de vérifier que le tampon "est prêt" avant de le lire, il devrait y avoir aucun problème.
OriginalL'auteur Ovid
Ok, je comprends ce fil est très vieux, mais aucune de ces solutions n'a fonctionné pour moi. J'ai eu le même problème et j'ai tout essayé de le réparer, en vain. Ensuite, j'ai fait quelques recherches sur ce que les causes du problème, et, lorsqu'il n'est pas de traiter avec un numéro de Série de la Communication, il arrive à la fin d'un fichier. Alors, j'ai pensé que j'avais besoin d'ajouter une fin à tout ce qui est reçu par l'Application Java, plus précisément, un retour à la ligne (\n). Et bien sûr, il a résolu le problème pour moi! Espérons que cela aide quelqu'un de nouveau, comme je ne suis pas attendre cela pour aider les gens déjà sur ce fil...
OriginalL'auteur djl911djl911
(peut-être trop simple, mais pourrait tout aussi bien commencer quelque part...)
Est le port à utiliser? Plutôt que:
ce sujet:
Êtes-vous d'en avaler des exceptions?
OriginalL'auteur Tom Clift
J'ai essayé RXTX il y a quelques mois et a couru dans des problèmes similaires. Je suggère deux choses:
Créer un virtuel de communication à l'aide de com0com. Activer la journalisation du suivi. Comparer les journaux pour lorsque vous utilisez Hyperterminal contre, lorsque vous exécutez votre propre programme. La différence va mettre en évidence ce que vous faites mal.
À mon humble avis, RXTX de la conception est erronée et sa mise en œuvre est assez buggé (jetez un oeil à son code source, quel gâchis!). J'ai publié une bibliothèque alternative à http://kenai.com/projects/jperipheral avec les caractéristiques suivantes: C'est uniquement sous Windows et il n'y a pas de pré-construit binaires. Deux de ces va changer dans un avenir proche. Si vous êtes intéressé à essayer de m'envoyer un e-mail à l'aide de http://desktopbeautifier.com/Main/contactus et je vais vous envoyer une pré-version construite.
OriginalL'auteur Gili
Si quelqu'un est encore en train
java.io.IOException: Underlying input stream returned zero bytes
après avoir lu un de vos personnages à l'aide de br.readline() pour RXTX (même lorsque vous êtes en vérifiant d'abord pour voir si fr.readline() == null), il suffit de faire ce simple à résoudre avec un try/catch:J'ai fait quelques recherches et il semble que c'est le meilleur/le plus simple pour obtenir autour de ce problème.
EDIT : je retire ce que. J'ai essayé et toujours fini par avoir des problèmes. Je vous recommande de travailler avec les premières InputStream directement, et la mise en œuvre de votre propre lecture/méthode readLine à l'aide de InputStream.read(). Ce qui a fonctionné pour moi.
OriginalL'auteur GordonFreeman