5

私はAllWinnerA13、RAM- 512mb、OS- Linaro 13.01 Ubuntu(debianを意味する)であるArmプロセッサを持っています。/ 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。ポートのストリームからの読み取り/ストリームへの書き込みが必要になるたびに、ストリームゲッターを使用します。

 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バグによって引き起こされていることを意味するものではありません。シリアルポートが正しく設定されていないことが原因である可能性がありますが、あなたの場合は、標準の接続パラメータを持つ標準のポート名です。ルーズショットとして、ボーレート115200を9600に置き換えてみてください。ただし、それではおそらく役に立たないでしょう。ここから3つのパスを提供できます。

  • RXTXコードをデバッグしてみてください-何が起こっているのかについてより多くの洞察を得るかもしれません
  • シリアルラインのトラブルシューティングを読む
  • RXTXの代わりにJSSCなど、シリアル通信用の他のJavaソリューションを検討してください。

アップデート:

私は注意を怠り、前に飛び出したのではないかと心配しています。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など)があります。ネイティブlibsソースコードは、同じ命令セットからの一連の命令である実行可能ファイル(.so、...)を生成するようにコンパイルされます。

JSSCでUnsatisfiedLinkErrorが発生した理由 は、サポートされていないアーキテクチャを使用していて、対応するネイティブライブラリが存在しないディレクトリで検索されていることが原因である可能性があります。JSSCのこれらのディレクトリの名前でもあるISAショートコードは、x86およびPPCアーキテクチャであり、32ビットと64ビットの両方のバリアントです。RXTXには他にもたくさんありますが、 AllWinnerA13CPUのISAであるARMv7と同等のものはないと思います。

ターミナルで次のコマンドを実行することにより、アーキテクチャを判別できます。

uname -m

私のLinuxでは、次のように出力されます。

x86_64

これは、64ビットのIntel8086アーキテクチャであることを意味します。JSSCとRXTXの両方がこのアーキテクチャを実装しています。アーキテクチャが実装されていない(サポートされていない)場合、これらのライブラリを使用してそのコンピュータのシリアルポートに接続することはできません。その場合は、独自に作成するか、適切な実装を入手する必要があります。

アーキテクチャが一致し、それでもネイティブエラーが発生する場合は、ネイティブライブラリソースを再コンパイルしてみてください。ソースはRXTXJSSCの両方に提供されます。

アップデート:

アーキテクチャがarmv7lそれである場合、現在の状態のJSSC、RXTX、およびJavaComm(概算ではRXTXの「祖先」)はシナリオでは役に立たないことを意味します。

シリアル通信用の他のオープンソースJavaライブラリを見つけることができませんでした。それが本当に本当なら、あなたはそれらを有用にするために上記のライブラリの1つのインターフェースに準拠するあなた自身のネイティブライブラリを書く必要があるでしょう。つまり、シリアル通信とJavaライブラリへのJNIインターフェイス機能を備えたCプログラム(1、2のようなもの)を作成する必要があります。

答えの完全性という意味で、いくつかのARMアーキテクチャをサポートする商用製品SerialIOについて説明します(あなたがそれらの1つであるかどうかはわかりません)。しかし、その解決策を決定した場合は、いつでもサポートにクエリを送信できます。

于 2013-03-22T10:36:17.887 に答える