5

我有 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……更多时间,然后是错误。而不是 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)
4

1 回答 1

5

我没有尝试在环回场景中通过 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 错误引起的。这可能是因为串行端口设置不正确,但在您的情况下,它是具有标准连接参数的标准端口名称。作为一个很长的镜头,尝试用 9600 替换波特率 115200,但这可能无济于事。我可以从这里提供三种途径:

  • 尝试调试 RXTX 代码 - 您可能会更深入地了解正在发生的事情
  • 阅读串口线故障排除
  • 考虑其他用于串行通信的 Java 解决方案,例如JSSC而不是 RXTX。

更新:

恐怕我一不留神就往前跳了。JSSC 本机库(.so、.dll)位于 jssc.jar 中,因此它们是“自动”加载的。对于 RXTX,它们位于 jar 文件之外,因此您需要设置java.library.path系统属性以便 JVM 找到并加载它们,否则您将收到 UnsatisfiedLinkError。

您可以通过双击打开 JSSC jar 文件,它会在存档器中打开,因为它实际上是一个 zip 文件。与 RXTX 一样,您会注意到本机 libs 文件组织在命名为操作系统的目录中(windows、linux,RXTX 也有 Mac_OS_X 和 Solaris)。

在这些目录中有本地 libs 文件、.so、dll. 和 .jnilib 类型的文件,它们以计算机体系结构命名。这是这个词的更广泛含义,这些是指令集架构 (ISA)的短代码。指令集定义了 CPU 的指令集(命令)。换句话说,有许多不同的 CPU 型号(如您的 AllWinner A13)符合相同的指令集。本机库源代码被编译以生成可执行文件(.so,...),这是来自同一指令集的一堆指令。

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

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

uname -m

在我的 linux 上,它输出:

x86_64

这意味着它是64 位 Intel 8086 架构。JSSC 和 RXTX 都实现了这种架构。如果您的架构未实现(支持),那么您将无法使用这些库连接到该计算机上的串行端口。在这种情况下,您必须自己编写或获得合适的实现。

如果架构匹配并且仍然存在本机错误,您可以尝试重新编译本机库源。为RXTXJSSC提供了源代码。

更新:

如果您的架构是armv7l这意味着当前状态下的 JSSC、RXTX 和JavaComm(近似表示,RXTX“祖先”)在您的场景中是无用的。

我没有找到任何其他用于串行通信的开源 Java 库。如果这是真的,您需要编写符合上述库之一的接口的自己的本机库,以使它们有用。换句话说,您需要编写一个具有串行通信功能和Java 库的JNI接口的C程序(类似于:12) 。

在回答完整性的意义上,我会提到一个商业产品SerialIO,它确实支持一些 ARM 架构(不知道你是否是其中之一)。但是,如果您决定采用该解决方案,您可以随时向他们的支持发送查询。

于 2013-03-22T10:36:17.887 回答