Wie lösen die java-Fehlermeldung.io.IOException: Input/output error in nativeavailable für die Serielle Kommunikation?
Habe ich Arm-Prozessor ist AllWinner A13 ,RAM - 512mb und OS - Linaro 13.01 Ubuntu (also debian). Jetzt habe ich m machen Serielle Kommunikation Programm für /dev/ttyS0. ich machte einfach Programm für Zwei-Wege-Serielle Kommunikation in java mit netbeans. In meinem Prozessor ich kurz rx-tx von ttyS0 für loop-back-coonection überprüfen. Bedeutet was auch immer ich sende über den Seriellen port bekomme ich auch wieder zurück. aber ich bekomme Fehler. ich installierte openjdk-7, librxtx-java auf meinem Prozessor. mein code und die Fehlermeldung ist unten. Wenn irgendeine Idee oder Lösung, dann bitte, schlage mich.
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();
}
}
}
meine aus unten . In diesem heraus, dass ich nur senden, 123, und ich komme zurück 23 den ersten und dann 1111... mehr Zeit, und dann errore. Statt 111111.... ich will nur wieder zurück 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)
InformationsquelleAutor Jay | 2013-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich es noch nicht versucht serielle Kommunikation über RXTX in einer loopback-Szenario, aber das sollte keine Rolle spielen. Das einzige, was, das sieht ein bisschen verdächtig ist das Teil, wo man die Instanz des input-Streams an die
SerialReader
. Ich empfehle, dass Sie passSerialPort
Instanz sowohl Konstruktoren, und jedes mal, wenn Sie benötigen zum Lesen von/schreiben auf dem port den stream, verwenden Sie ein stream-getter, z.B. für das Lesen:bitte feedback.
UPDATE:
Aus meiner persönlichen Erfahrung RXTX ist eine buggy-Lösung. Dies bedeutet jedoch nicht, dass diese situation verursacht durch eine zugrunde liegende RXTX-bug. Es könnte sein, weil der serielle port ist nicht richtig konfiguriert, aber in deinem Fall ist es eine standard-port-Namen mit standard-Verbindungs-Parameter. Als einen laaaangen shot, ersetzen Sie die baudrate 115200 9600, aber das wird wahrscheinlich nicht helfen. Ich kann Ihnen drei Wege von hier aus:
UPDATE:
Ich fürchte, ich war unaufmerksam und sprang vor. JSSC native Bibliotheken (.so,.dll) innerhalb des jssc.jar Sie sind also geladen "automatisch". Mit RXTX Sie kommen außerhalb der jar-Datei, so müssen Sie die
java.library.path
system-Eigenschaft, um für die JVM zu finden und laden Sie Sie, oder erhalten Sie einen UnsatisfiedLinkError.Öffnen Sie die JSSC jar-Datei durch einen Doppelklick und es öffnet sich in ein Archivprogramm, weil es eigentlich eine zip-Datei. Als mit RXTX, werden Sie feststellen, dass die native libs Dateien werden in Verzeichnissen organisiert, die den Namen Betriebssystemen (windows, linux, RXTX hat Mac_OS_X und Solaris auch).
Innerhalb dieser Verzeichnisse gibt es die native libs Dateien, die .so, dll., und .jnilib Arten von Dateien, die benannt sind nach computer-Architekturen. Das ist die breitere Bedeutung des Wortes sind diese kurz-codes für Befehlssatz-Architekturen (ISA). Der Befehlssatz definiert den Satz von Anweisungen (Befehle) für eine CPU. In anderen Worten, es gibt viele verschiedene CPU-Modelle (wie Ihr AllWinner A13) , entsprechen den gleichen Befehlssatz. Die native libs-source-code kompiliert wird, erzeugen der ausführbaren Dateien (.so,...), die eine Reihe von Anweisungen aus, dass die gleichen Befehlssatz.
Den Grund, warum Sie bekam den UnsatisfiedLinkError mit JSSC könnte werden, weil Sie auf einer nicht unterstützten Architektur und der entsprechenden native-lib wird gesucht in einer unexistent-Verzeichnis. ISA kurz-codes, die auch die Namen dieser Verzeichnisse für JSSC sind x86 und PPC Architekturen, 32-und 64-bit-Variante. RXTX hat, viele andere aber ich denke, dass keiner von Ihnen entspricht ARMv7 was ist die ISA von Ihrem AllWinner A13 CPU.
Können Sie bestimmen Ihr Architektur durch die Ausführung dieses Befehls im terminal:
Auf meinem linux-Ausgänge:
was bedeutet, dass es eine 64bit-Intel-8086-Architektur. Beide JSSC und RXTX implementiert haben, diese Architektur. Wenn Ihr die Architektur nicht implementiert (unterstützt), als Sie nicht verwenden können diese Bibliotheken für die Verbindung zum seriellen port auf dem computer. In diesem Fall müssen Sie schreiben Sie Ihren eigenen oder Sie erhalten eine geeignete Implementierung.
Wenn die Architektur passt und es gibt immer noch nativen Fehler, könnten Sie versuchen, kompilieren die native libs Quellen. Die Quellen sind für beide RXTX und JSSC.
UPDATE:
Wenn Ihre Architektur ist
armv7l
das bedeutet, dass JSSC, RXTX und JavaComm (ungefähr sagte, RXTX "Vorfahren") in Ihren aktuellen Zustand sind nutzlos in Ihrem Szenario.Ich schaffte es nicht zu finden, alle anderen open-source-java-Bibliothek für die serielle Kommunikation. Wenn das wirklich wahr ist, würden Sie brauchen, um schreiben Sie Ihre eigenen native Bibliothek-konforme Schnittstelle, die eine der oben genannten Bibliotheken, dass Sie nützlich. In anderen Worten, Sie würde schreiben müssen, eine C - Programm (so etwas wie dies: Eins, Zwei) mit einer Funktionalität von serielle Kommunikation und JNI Schnittstelle der Java-Bibliothek.
Im Sinne der Antwort, die Vollständigkeit, die ich nennen werde, ein kommerzielles Produkt SerialIO, die unterstützt einige ARM-Architekturen (weiß nicht, ob Ihr einer von Ihnen). Aber wenn Sie sich entscheiden, die Lösung, können Sie immer senden Sie eine Abfrage, um Ihre Unterstützung.
ich habe versucht, nach Ihnen, sagte aber immer noch, dass alte Fehler ist aufgetreten.
yo gern geschehen, siehe update
vielen Dank für baldige Antwort hilft mir. jetzt werde ich versuchen Ihre Optionen eins nach dem anderen.
UnsatifsfiedLinkError bedeutet, dass der code versucht, einige externe Bibliotheken (.also für linux .dll für windows), aber kann Sie nicht finden. Sie brauchen, um zu finden, die dir, wo diese Dateien und stellen Sie als system-Eigenschaft. Siehe here wie. Aber das ist merkwürdig, das Letzte mal ich es benutzt habe, dass war nicht notwendig. Ich werde einen Blick nehmen, und bitte feedback.
InformationsquelleAutor linski