Как решить ошибку java.io.IOException: ошибка ввода/вывода в родном для последовательной связи?

У меня процессор Arm AllWinner A13, ОЗУ 512 МБ и ОС Linaro 13.01 Ubuntu (означает Debian). Сейчас я делаю программу Serial Communication для /dev/ttyS0. я сделал простую программу для двухсторонней последовательной связи в java с netbeans. В моем процессоре я закорачиваю rx-tx ttyS0 для проверки обратной связи. Означает, что все, что я когда-либо отправляю через последовательный порт, я получаю обратно. но я получаю ошибку. Я установил 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)

person Jay    schedule 22.03.2013    source источник


Ответы (1)


Я не пробовал последовательную связь через 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, но это, вероятно, не поможет. Я могу предложить три пути отсюда:

ОБНОВИТЬ:

Боюсь, я был невнимателен и забежал вперед. Собственные библиотеки JSSC (.so,.dll) находятся внутри jssc.jar, поэтому они загружаются «автоматически». С RXTX они выходят за пределы jar-файла, поэтому вам нужно установить системное свойство java.library.path, чтобы JVM могла найти и загрузить их, иначе вы получите UnsatisfiedLinkError.

Вы можете открыть файл jar JSSC двойным щелчком, и он откроется в архиваторе, потому что это фактически zip-файл. Как и в случае с RXTX, вы заметите, что собственные файлы libs организованы в каталоги с именами операционных систем (windows, linux, RXTX также имеет Mac_OS_X и Solaris).

Внутри этих каталогов находятся собственные файлы libs, файлы типов .so, dll. и .jnilib, названные в честь архитектура компьютера. Это более широкое значение слова, это короткие коды для архитектур набора инструкций (ISA). Набор инструкций определяет набор инструкций (команд) для ЦП. Другими словами, существует множество различных моделей ЦП (например, AllWinner A13), которые соответствуют одному и тому же набору инструкций. Исходный код собственных библиотек скомпилирован для создания исполняемых файлов (.so,...), которые представляют собой набор инструкций из того же набора инструкций.

Причина, по которой вы получили UnsatisfiedLinkError с JSSC, может быть, заключается в том, что вы используете неподдерживаемую архитектуру, а соответствующая нативная библиотека ищется в несуществующем каталоге. Сокращенные коды ISA, которые также являются именами этих каталогов для JSSC: x86 и PPC, как 32-, так и 64-битный вариант. У RXTX есть много других, но я думаю, что ни один из них не эквивалентен ARMv7, который является ISA для ваш процессор AllWinner A13.

Вы можете определить свою архитектуру, выполнив эту команду в терминале:

uname -m

На моем линуксе выводит:

x86_64

что означает, что это 64-битная архитектура Intel 8086. И JSSC, и RXTX реализовали эту архитектуру. Если ваша архитектура не реализована (поддерживается), вы не можете использовать эти библиотеки для подключения к последовательному порту на этом компьютере. В этом случае вы должны написать свою собственную или получить подходящую реализацию.

Если архитектура соответствует, но все еще есть собственные ошибки, вы можете попробовать перекомпилировать родные исходники libs. Исходники предоставляются как для RXTX, так и для JSSC.

ОБНОВИТЬ:

Если ваша архитектура armv7l, это означает, что JSSC, RXTX и JavaComm (примерно сказал , RXTX «предок») в их текущем состоянии бесполезны в вашем сценарии.

Мне не удалось найти какую-либо другую библиотеку Java с открытым исходным кодом для последовательной связи. Если это действительно так, вам нужно написать свою собственную нативную библиотеку, соответствующую интерфейсу одной из вышеперечисленных библиотек, чтобы сделать их полезными. Другими словами, вам нужно написать программу на C (что-то вроде этого : 1, 2) с функциями последовательной связи и JNI интерфейс к библиотеке Java.

В смысле полноты ответа упомяну коммерческий продукт SerialIO, который поддерживает некоторые архитектуры ARM ( не знаю, один ли ты из них). Но если вы выберете это решение, вы всегда можете отправить запрос в их поддержку.

person linski    schedule 22.03.2013
comment
Спасибо за ответ. здесь я использую сценарий обратной петли для проверки того, что все, что я отправляю через последовательный порт, возвращается ко мне. прежде чем использовать эту программу в лазерной и рентгеновской части, я должен очень хорошо ее проверить и протестировать. - person Jay; 22.03.2013
comment
Я пытался, как вы сказали, но все же произошла эта старая ошибка. - person Jay; 22.03.2013
comment
спасибо за ранний ответ за помощь мне. теперь я попробую ваши варианты один за другим. - person Jay; 22.03.2013
comment
я получил ошибку при попытке использовать jSSC-0.9.0-Release.zip (jssc.jar). я извлекаю эту папку jssc и использую jssc.jar в моем javaApp на ubuntu, и он выдает ошибку, например run: Exception in thread main java.lang.UnsatisfiedLinkError: jssc.SerialNativeInterface.openPort(Ljava/lang/String;) I at jssc.SerialNativeInterface .openPort(собственный метод) в jssc.SerialPort.openPort(SerialPort.java:143) в serialcomm_linaro.Main.main(Main.java:25) Результат Java: 1 ПОСТРОИТЬ УСПЕШНО (общее время: 2 секунды) - person Jay; 23.03.2013
comment
UnsatifsfiedLinkError означает, что код пытается использовать некоторые внешние библиотеки (.so для linux, .dll для windows), но не могу их найти. Вам нужно найти каталог, в котором находятся эти файлы, и установить его как системное свойство. См. здесь, как это сделать. Но это странно, в последний раз, когда я использовал его, в этом не было необходимости. Надо будет глянуть, а отзыв пожалуйста. - person linski; 25.03.2013
comment
я использовал jSSC-0.9.0-Release в myApp. но в jSSC-0.9.0-Release (версия) нет ничего похожего на файлы .dll или .so. я знаю, куда поместить файл .jar и файл .so в Linux. я также поместил этот jssc.jar в файл /usr/lib/jvm/openJdk-7/jre/lib/ext/jssc.jar и .so для этого пути /usr/lib/jvm/openJdk-7/jre/lib/ рука/ . но у меня нет файла .so jssc. Итак, где я могу получить (или скачать) файл .so версии jSSC-0.9.0-Release и процессора arm? пожалуйста, помогите мне. - person Jay; 26.03.2013
comment
Я ответил на ваш вопрос. Пожалуйста, напишите, какая у вас архитектура? - person linski; 28.03.2013
comment
спасибо за помощь мне. извините за поздний ответ. Я запускаю команду uname -m на моем процессоре amr и получаю ответ: armv7l. - person Jay; 30.03.2013
comment
@Джей, так чем это закончилось? внедрили, купили или бросили? или? :) - person linski; 18.04.2013
comment
Там rxtx работает хорошо. Основная проблема в том, что мой последовательный порт процессора руки находится в режиме отладки. поэтому я изменил свой файл сценария, и он отлично работает с RXTx. Я устанавливаю rxtx с помощью этой команды. sudo apt-get install librxtx-java. Спасибо за помощь и предложение, вы даете новую идею думать по-другому. - person Jay; 19.04.2013
comment
рад, что получилось! np, пожалуйста, я тоже узнал :) Не знал, что у RXTX есть свои родные библиотеки в репозиториях Linux! - person linski; 19.04.2013