RXTX как читать с ком порта - PullRequest
1 голос
/ 20 июля 2011

Привет, у меня что-то подобное

package compot;

import java.util.Enumeration;
import gnu.io.*;


public class core {

    private static SerialPort p;

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        Enumeration ports = CommPortIdentifier.getPortIdentifiers();
        System.out.println("start");
        while(ports.hasMoreElements())
        {
            CommPortIdentifier port = (CommPortIdentifier) ports.nextElement();
            System.out.print(port.getName() + " -> " + port.getCurrentOwner() + " -> ");
            switch(port.getPortType())
            {
                case CommPortIdentifier.PORT_PARALLEL:
                    System.out.println("parell");
                break;
                case CommPortIdentifier.PORT_SERIAL:
                    //System.out.println("serial");
                try {
                    p = (SerialPort) port.open("core", 1000);
                    int baudRate = 57600; // 57600bps
                    p.setSerialPortParams(
                            baudRate,
                            SerialPort.DATABITS_8,
                            SerialPort.STOPBITS_1,
                            SerialPort.PARITY_NONE);
                } catch (PortInUseException e) {
                    System.out.println(e.getMessage());
                } catch (UnsupportedCommOperationException e) {
                    System.out.println(e.getMessage());
                }
                break;
            }
        }
        System.out.println("stop");
    }
}

Но я не знаю, как читать из порта ?? Я прочитал этот урок , но я не знаю, что они означают под "Демо-приложением" ??

EDIT

OutputStream outStream = p.getOutputStream();
                    InputStream inStream = p.getInputStream();

                    BufferedReader in = new BufferedReader( new InputStreamReader(inStream));
                    String inputLine;

                    while ((inputLine = in.readLine()) != null) 
                        System.out.println(inputLine);
                    in.close();

Я добавил этот код, но я получаю

Стабильная библиотека =============================================== Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 start / dev / ttyUSB3 -> null -> Базовый входной поток возвратил нулевые байты stop

Ответы [ 3 ]

6 голосов
/ 20 июля 2011

Это твой код? Что ты на самом деле пытаешься там делать? : Р

Для чтения с SerialPort вам необходимо объявить этот порт:

CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("/dev/tty/USB0"); //on unix based system

Затем откройте соединение на этом порту:

SerialPort serialPort = (SerialPort) portIdentifier.open("NameOfConnection-whatever", 0);

Следующим шагом будет установка параметров этого порта (при необходимости):

serialPort.setSerialPortParams(38400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

Это мой конфиг - ваш может отличаться соответственно:)

Теперь вы готовы прочитать некоторые данные на этом порту! Чтобы получить данные, вам нужно получить входной поток serialPorts и прочитать из него:

InputStream inputStream = serialPort.getInputStream();
while (active) {
        try {
            byte[] buffer = new byte[22];
            while ((buffer[0] = (byte) inputStream.read()) != 'R') {
            }
            int i = 1;
            while (i < 22) {
                if (!active) {
                    break;
                }
                buffer[i++] = (byte) inputStream.read();
            }
            //do with the buffer whatever you want!
        } catch (IOException ex) {
            logger.error(ex.getMessage(), ex);
        }
}

Что я на самом деле здесь делаю, так это чтение из входного потока, используя метод read(). Он будет блокироваться до тех пор, пока данные не станут доступны, или вернет -1, если достигнут конец потока. В этом примере я жду, пока не получу символ 'R', а затем считываю следующие 22 байта в буфер. И вот как вы читаете данные.

  1. Получение входного потока serialPorts
  2. использовать метод .read ()
  3. есть все внутри цикла и цикла выхода при отмене (в моем случае active может быть установлен в false другим методом и, таким образом, завершить процесс чтения.

надеюсь, это поможет

2 голосов
/ 07 октября 2011

Попробуйте использовать

if (socketReader.ready()) {
}

, чтобы сокет реагировал только тогда, когда есть что-то для чтения в буферном потоке, чтобы исключение никогда не возникало.

0 голосов
/ 20 июля 2011

Примерно так в вашем блоке try:

OutputStream outStream = p.getOutputStream();
InputStream inStream = p.getInputStream();
...