如何解决java.io.IOException错误:可用于串行通信的本地输入/输出错误?
我有Arm处理器,它是AllWinner A13、RAM-512mb和OS-Linaro 13.01 Ubuntu(意思是debian)。现在我正在为/dev/ttyS0编写串行通信程序。我用netbeans用java编写了一个简单的双向串行通信程序。在我的处理器中,我短接ttyS0的rx tx,用于环回连接检查。意味着我通过串行端口发送的任何内容都会返回。但我有一个错误。我在我的处理器上安装了openjdk-7、librxtxJava。我的代码和错误如下。如果有任何想法或解决方案,请向我建议如何解决java.io.IOException错误:可用于串行通信的本地输入/输出错误?,java,rxtx,serial-communication,Java,Rxtx,Serial Communication,我有Arm处理器,它是AllWinner A13、RAM-512mb和OS-Linaro 13.01 Ubuntu(意思是debian)。现在我正在为/dev/ttyS0编写串行通信程序。我用netbeans用java编写了一个简单的双向串行通信程序。在我的处理器中,我短接ttyS0的rx tx,用于环回连接检查。意味着我通过串行端口发送的任何内容都会返回。但我有一个错误。我在我的处理器上安装了openjdk-7、librxtxJava。我的代码和错误如下。如果有任何想法或解决方案,请向我建议
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();
}
}
}
我的名字在下面。在这出我只是发送123,我得到返回23第一,然后1111。。。更多的时间,然后出错。而不是111111。。。。我只想返回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)
在环回场景中,我没有尝试通过RXTX进行串行通信,但这不重要。唯一看起来有点可疑的是将输入流的实例提供给
SerialReader
的部分。我建议您将SerialPort
实例传递给这两个构造函数,每次需要读取/写入端口的流时,使用流getter,例如用于读取:
public static class SerialReader implements Runnable
{
SerialPort serialPort;
public SerialReader ( SerialPort serialPort )
{
this.serialPort = serialPort;
}
public void run ()
{
byte[] buffer = new byte[1024];
int len = -1;
try
{
while ( ( len = serialPort.getInputStream().read(buffer)) > -1 )
{
System.out.print(new String(buffer,0,len));
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
请反馈
更新:
从我个人的RXTX是一个有缺陷的解决方案。然而,这并不意味着这种情况是由潜在的RXTX错误引起的。这可能是因为串行端口设置不正确,但在您的情况下,它是带有标准连接参数的标准端口名。作为一个looong快照,尝试用9600替换波特率115200,但这可能不会有帮助。我可以从这里提供三条路径:
- 尝试调试RXTX代码-您可能会对正在发生的事情有更多的了解
- 阅读
- 考虑其他用于串行通信的Java解决方案,比如代替RXTX李>
java.library.path
系统属性,以便JVM找到并加载它们,否则会出现不满意的链接错误
您可以通过双击打开JSSCJAR文件,它将在archiver中打开,因为它是。与RXTX一样,您会注意到本机libs文件被组织在类似操作系统的目录中(windows、linux、RXTX也有Mac_OS_X和Solaris)
在这些目录中,有本机libs文件、.so、.dll.和.jnilib类型的文件,这些文件以名称命名。这是这个词更广泛的含义,这些是简短的代码。指令集定义CPU的指令集(命令)。换句话说,有许多不同的CPU型号(如AllWinner A13)符合相同的指令集。编译本机libs源代码以生成可执行文件(.so,…),这是来自同一指令集的一组指令
JSSC出现UnsatisfiedLinkError的原因可能是因为您使用的是不受支持的体系结构,并且在不存在的目录中搜索对应的本机库。ISA短代码(也是JSSC的这些目录的名称)是和体系结构,包括32位和64位变体。RXTX还有很多其他的功能,但我认为它们中没有一个可以与CPU的ISA相媲美
您可以通过在终端中执行以下命令来确定您的目标:
uname -m
在我的linux上,it输出:
x86_64
也就是说,它是一个。JSSC和RXTX都实现了这种体系结构。如果未实现(支持)您的体系结构,则无法使用这些库连接到该计算机上的串行端口。在这种情况下,您必须自己编写或获得适当的实现
如果架构匹配并且仍然存在本机错误,则可以尝试使用本机libs源。为和提供了来源
更新:
如果您的体系结构是armv7l
,这意味着JSSC、RXTX和(Occessley说,RXTX“祖先”)在当前状态下在您的场景中是无用的
我没有找到任何其他用于串行通信的开源java库。如果这是真的,那么您需要编写自己的本机库,使其符合上述库之一的接口,从而使它们变得有用。换句话说,您需要编写一个具有Java库功能和接口的程序(如下所示:,)
在回答完整性的意义上,我将提到一个支持一些ARM体系结构的商业产品(不知道您是否是其中之一)。但是,如果您决定采用该解决方案,您可以随时向他们的支持部门发送查询。谢谢您的回复。在这里,我使用环回场景来测试通过串行端口发送的内容是否返回给我。在激光和x射线部分使用此程序之前,我必须对其进行检查和测试。我按照您所说的进行了尝试,但仍然出现了旧错误。感谢您对我的帮助尽早回复。现在我将逐一尝试您的选项。我在尝试使用jSSC-0.9.0-Release.zip(jSSC.jar)时出错。我提取那个jssc文件夹并在ubuntu上的javaApp中使用jssc.jar,它在线程“main”java.lang.UnsatifiedLinkError:jssc.SerialNativeInterface.openPort(Ljava/lang/String;)的jssc.SerialNativeInterface.openPort(本机方法)的jssc.SerialPort.openPort(SerialPort.java:143)中给出类似run:Exception的错误在serialcomm_linaro.Main.Main(Main.java:25)中,java结果:1生成成功(总时间:2秒)意味着代码尝试使用一些外部库(.so用于linux,.dll用于windows),但找不到它们。您需要找到这些文件所在的目录,并将其设置为系统属性。看看怎么做。但这很奇怪,上次我用它的时候没有必要。我得走了