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

问题描述 投票:4回答:1

我有Arm处理器,它是AllWinner A13,RAM-512mb和OS- Linaro 13.01 Ubuntu(意味着debian)。现在,我正在为/ dev / ttyS0编写串行通信程序。我用netbeans用Java编写了双向双向通信的简单程序。在我的处理器中,我将ttyS0的rx-tx短短用于回送连接检查。表示我通过串口发送回来的所有内容。但我得到错误。我在处理器上安装了openjdk-7,librxtx-java。我的代码和错误如下。如果有任何想法或解决方案,请向我建议。

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……更多时间,然后是errore。而不是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)
java rxtx serial-communication
1个回答
5
投票

我没有在环回情况下尝试通过RXTX进行串行通信,但这没关系。唯一看起来有点可疑的是将输入流的实例提供给SerialReader的部分。我建议您将SerialPort实例传递给两个构造函数,并且每当您需要对端口的流进行读/写操作时,请使用流获取器,例如阅读:

 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();
        }            
    }
}

请反馈。

更新:

[根据我的个人experience RXTX是一个越野车解决方案。但是,这并不意味着这种情况是由潜在的RXTX错误引起的。可能是因为串行端口设置不正确,但是在您的情况下,它是带有标准连接参数的标准端口名称。放宽镜头,尝试将波特率115200替换为9600,但这可能无济于事。我可以从这里提供三种路径:

  • 尝试调试RXTX代码-您可能会对正在发生的事情有更多的了解
  • 读取serial line troubleshooting
  • 考虑用于串行通信的其他Java解决方案,例如JSSC而不是RXTX。

更新:

恐怕我一直不专心,跳到了前面。 JSSC本机库(.so,.dll)位于jssc.jar中,因此可以“自动”加载。使用RXTX时,它们不在jar文件之外,因此您需要设置java.library.path系统属性,以便JVM查找并加载它们,否则您将收到UnsatisfiedLinkError。

您可以双击打开JSSC jar文件,因为它是actually a zip file,所以它将在存档器中打开。与RXTX一样,您会注意到本机libs文件组织在名为操作系统的目录中(Windows,Linux,RXTX也具有Mac_OS_X和Solaris)。

在这些目录中有本机libs文件,.so,dll和.jnilib类型的文件,它们以computer architectures命名。这是该词的广义含义,它们是instruction set architectures (ISA)的短代码。指令集定义了CPU的指令集(命令)。换句话说,有许多不同的CPU型号(例如AllWinner A13)符合相同的指令集。编译本地libs源代码以生成可执行文件(.so,...),该可执行文件是来自同一指令集的一堆指令。

使用JSSC出现UnsatisfiedLinkError的原因可能是因为您使用的是不受支持的体系结构,并且正在不存在的目录中搜索相应的本机lib。 ISA短代码(也是JSSC的这些目录的名称)是x86PPC体系结构,都是32位和64位变体。 RXTX还有许多其他功能,但我认为它们都不等同于ARMv7,这是AllWinner A13 CPU的ISA。

您可以通过在终端中执行此命令来确定您的architecture

uname -m

在我的Linux上,它输出:

x86_64

这意味着它是一个64bit Intel 8086 architecture。 JSSC和RXTX都实现了此体系结构。如果未实现(支持)您的体系结构,则不能使用这些库连接到该计算机上的串行端口。在这种情况下,您必须编写自己的代码或获取合适的实现。

如果体系结构匹配并且仍然存在本机错误,则可以尝试recompiling本机libs源。为RXTXJSSC提供了信号源。

更新:

[如果您的体系结构为armv7l,则表示它们的当前状态下的JSSC,RXTX和JavaComm(近似地说,RXTX“祖先”)在您的方案中是无用的。

我没有找到其他用于串行通信的开源Java库。如果确实如此,则需要编写自己的本机库以符合上述库之一的接口,以使它们有用。换句话说,您需要编写一个具有C1接口到Java库的功能的2程序(类似:serial communicationJNI)。

就答案的完整性而言,我会提到一种商业产品SerialIO,它确实支持某些ARM体系结构(不知道您是否是其中之一)。但是,如果您决定采用该解决方案,则可以随时向其支持小组发送查询。


0
投票

我在TX2 Jetson(3月64日)上遇到了相同的问题,@jay你伤心:有rxtx效果很好。主要问题是我的Arm处理器的串行端口处于调试模式。

© www.soinside.com 2019 - 2024. All rights reserved.