如何解决java.io.IOException错误:可用于串行通信的本地输入/输出错误?

如何解决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。我的代码和错误如下。如果有任何想法或解决方案,请向我建议

我有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
更新:

恐怕我一直没注意,跳到前面去了。JSSC本机库(.so、.dll)位于JSSC.jar内,因此它们是“自动”加载的。使用RXTX时,它们位于jar文件之外,因此需要设置
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),但找不到它们。您需要找到这些文件所在的目录,并将其设置为系统属性。看看怎么做。但这很奇怪,上次我用它的时候没有必要。我得走了