Comment résoudre l'erreur java.io.IOException: erreur d'Entrée/sortie dans nativeavailable pour la Communication Série?
J'ai processeur Arm qui est AllWinner A13 ,mémoire RAM - 512 mo-OS - Linaro 13.01 Ubuntu (debian). Maintenant, je m faisant de Série du programme de Communication pour /dev/ttyS0. j'ai fait simple programme pour les Deux sens de Communication Série en java avec netbeans. Dans mon processeur je court rx-tx de ttyS0 pour la boucle de retour coonection vérification. Les moyens ce que j'ai envoyer par l'intermédiaire du port Série que je serai de retour en arrière. mais j'obtiens l'erreur. j'ai installé openjdk-7, librxtx-java sur mon processeur. mon code et l'erreur est ci-dessous. Si quelqu'un a une idée ou solution, alors s'il vous plaît suggérer à moi.
package serialcomm_linaro;
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TwoWaySerialComm
{
public TwoWaySerialComm()
{
super();
}
void connect ( String portName ) throws Exception
{
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if ( portIdentifier.isCurrentlyOwned() )
{
System.out.println("Error: Port is currently in use");
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
if ( commPort instanceof SerialPort )
{
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
(new Thread(new SerialReader(in))).start();
(new Thread(new SerialWriter(out))).start();
}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}
/** */
public static class SerialReader implements Runnable
{
InputStream in;
public SerialReader ( InputStream in )
{
this.in = in;
}
public void run ()
{
byte[] buffer = new byte[1024];
int len = -1;
try
{
while ( ( len = this.in.read(buffer)) > -1 )
{
System.out.print(new String(buffer,0,len));
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
/** */
public static class SerialWriter implements Runnable
{
OutputStream out;
public SerialWriter ( OutputStream out )
{
this.out = out;
}
public void run ()
{
try
{
int c = 0;
while ( ( c = System.in.read()) > -1 )
{
this.out.write(c);
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
public static void main ( String[] args )
{
try
{
(new TwoWaySerialComm()).connect("/dev/ttyS0");
}
catch ( Exception e )
{
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
mon est ci-dessous . Dans ce hors je viens d'envoyer 123 et je reçois un retour en arrière 23 en premier et ensuite 1111... plus de temps, et puis errore. Au lieu de 111111.... je veux juste revenir 123.
enter code here
RXTX Warning: Removing stale lock file. /var/lock/LCK..ttyS0
123
23
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
java.io.IOExcepti on: Input/output error in nativeavailable
at gnu.io.RXTXPort.nativeavailable(Native Method)
at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1429)
at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1341)
at serialcomm_linaro.TwoWaySerialComm$SerialReader.run(TwoWaySerialComm.java:66)
at java.lang.Thread.run(Thread.java:722)
OriginalL'auteur Jay | 2013-03-22
Vous devez vous connecter pour publier un commentaire.
Je n'avais pas essayé de communication série sur RXTX dans une boucle de scénario, mais cela ne devrait pas d'importance. La seule chose qui semble un peu suspecte est la partie où vous donnez l'exemple du flux d'entrée pour le
SerialReader
. Je vous recommande de passerSerialPort
exemple pour les deux constructeurs, et à chaque fois que vous avez besoin pour lire/écrire le port est en cours, utiliser un flux de lecture, par exemple pour la lecture:prière de commentaires.
Mise à JOUR:
De mon l'expérience RXTX est un buggy solution. Toutefois, cela ne signifie pas que cette situation est causée par un sous-jacente RXTX bug. Il se peut que le port série n'est pas configuré correctement, mais dans votre cas, c'est un port standard nom de la norme, les paramètres de connexion. Comme un loooong tir, essayez de remplacer le débit en bauds 115200 avec 9600, mais qui ne sera probablement pas aider. Je peux offrir trois chemins à partir d'ici:
Mise à JOUR:
J'ai peur, j'ai été distrait et a sauté à l'avance. JSSC bibliothèques natives (.donc,.dll) sont à l'intérieur de la jssc.jar donc, ils sont chargés "automatiquement". Avec RXTX ils viennent de l'extérieur le fichier jar si vous avez besoin de définir le
java.library.path
système de la propriété afin de la JVM pour les trouver et de les charger ou vous aurez un UnsatisfiedLinkError.Vous pouvez ouvrir la JSSC jar fichier par un double-clic, et l'ouvrir dans un archiveur, car il est en fait un fichier zip. Comme avec RXTX, vous remarquerez que le natif libs fichiers sont organisés dans des répertoires nommés comme les systèmes d'exploitation (windows, linux, RXTX a Mac_OS_X et Solaris).
À l'intérieur de ces répertoires, il ya le natif libs fichiers, les .donc, dll., et .jnilib types de fichiers, qui sont nommés d'après architectures informatiques. C'est le sens le plus général du mot, ce sont des numéros courts pour jeu d'instructions architectures (ISA). Le jeu d'instruction définit l'ensemble des instructions (commandes) pour un CPU. En d'autres termes, il ya beaucoup de différents modèles de CPU (comme votre AllWinner A13) qui respectent le même jeu d'instructions. Le natif libs code source est compilé pour produire les fichiers exécutables (.donc,...) qui est un groupe d'instructions à partir de ce même jeu d'instructions.
La raison pour laquelle vous avez obtenu le UnsatisfiedLinkError avec JSSC pourrait être parce que vous êtes sur une non prise en charge de l'architecture, et le natif correspondant lib est est recherché dans une unexistent répertoire. L'ISA codes courts, qui sont aussi les noms de ces répertoires pour JSSC sont x86 et PPC les architectures 32 et 64 bit. RXTX a beaucoup d'autres mais je pense qu'aucun d'entre eux est l'équivalent de ARMv7 qui est de l'ISA de votre AllWinner A13 CPU.
Vous pouvez déterminer votre l'architecture par l'exécution de cette commande dans le terminal:
Sur mon linux il ouputs:
ce qui signifie que c'est un 64bit Intel 8086 architecture. Les deux JSSC et RXTX ont mis en œuvre cette architecture. Si votre système n'est pas mis en œuvre (prise en charge) que vous ne pouvez pas utiliser ces bibliothèques à se connecter au port série sur l'ordinateur. Dans ce cas, vous devez écrire votre propre ou d'obtenir une mise en œuvre adaptée.
Si l'architecture des matchs et il y a encore des natifs des erreurs, vous pouvez essayer la recompilation le natif libs sources. Les sources sont fournies pour les deux RXTX et JSSC.
Mise à JOUR:
Si votre architecture est
armv7l
qui signifie que JSSC, RXTX et JavaComm (approximatley dit, RXTX "ancêtre") dans leur état actuel sont inutiles dans votre scénario.Je n'ai pas réussi à trouver d'autres open source java de la bibliothèque pour la communication série. Si c'est vraiment le cas, vous auriez besoin d'écrire votre propre bibliothèque native conforme à l'interface de l'une des bibliothèques ci-dessus pour les rendre utiles. En d'autres termes, vous aurez besoin de rédiger un C programme (quelque chose comme ceci: Un, Deux) avec des fonctionnalités de la communication série et JNI interface de la bibliothèque Java.
Dans le sens de la réponse souci d'exhaustivité, je vais vous parler d'un produit commercial SerialIO qui prend en charge certaines architectures ARM (je ne sais pas si le votre est l'un d'entre eux). Mais si vous vous décidez pour cette solution, vous pouvez toujours envoyer une requête à leur prise en charge.
j'ai essayé selon vous l'avez dit, mais encore cette vieille erreur s'est produite.
yo êtes les bienvenus, voir mise à jour
merci pour la réponse rapide pour aider à moi. maintenant, je vais essayer vos options une par une.
UnsatifsfiedLinkError signifie que le code tente d'utiliser certaines bibliothèques externes (.donc, pour linux, .dll pour windows), mais ne peuvent pas les trouver. Vous devez trouver le répertoire où les fichiers et la définir comme système de la propriété. Voir here comment. Mais c'est bizarre, la dernière fois que je l'ai utilisé que ce n'était pas nécessaire. Je vais jeter un oeil, et s'il vous plaît rétroaction.
OriginalL'auteur linski