2017-02-20 8 views
0

Я использую библиотеку jssc для связи с устройством через последовательный порт. В стандартной библиотеке Java SerialComm есть два метода getInputStream() и getOutputStream().jssc getInputStream() getOutputstream()

Зачем мне это нужно? Я хочу осуществить Xmodem согласно this примеру и Xmodem конструктора требует два Params:

public Xmodem(InputStream inputStream, OutputStream outputStream) 
{ 
    this.inputStream = inputStream; 
    this.outputStream = outputStream; 
} 


Xmodem xmodem = new Xmodem(serialPort.getInputStream(),serialPort.getOutputStream()); 

В АСКЕ есть нет таких методов, но мне интересно, есть ли какой-то другой способ?

ответ

0

Одна из возможностей заключается в предоставлении пользовательского класса PortInputStream, который расширяет InputStream и реализует интерфейс JSSCs SerialPortEventListener. Этот класс получает данные из последовательного порта и сохраняет его в буфере. Он также предоставляет метод read() для получения данных из буфера.

private class PortInputStream extends InputStream implements SerialPortEventListener { 
    CircularBuffer buffer = new CircularBuffer(); //backed by a byte[] 

    @Override 
    public void serialEvent(SerialPortEvent event) { 
    if (event.isRXCHAR() && event.getEventValue() > 0) { 
    // exception handling omitted 
    buffer.write(serialPort.readBytes(event.getEventValue())); 
    } 
    } 

@Override 
public int read() throws IOException { 
    int data = -1; 
    try { 
    data = buffer.read(); 
    } catch (InterruptedException e) { 
    Log.e(TAG, "interrupted while waiting for serial data."); 
    } 

    return data; 
} 

@Override 
public int available() throws IOException { 
    return buffer.getLength(); 
} 

Кроме того, вы можете предоставить собственный PortOutputStream класс, который расширяет OutputStream и записывает на последовательный интерфейс:

private class PortOutputStream extends OutputStream { 

    SerialPort serialPort = null; 

    public PortOutputStream(SerialPort port) { 
    serialPort = port; 
    } 

    @Override 
    public void write(int data) throws IOException,SerialPortException { 
    if (serialPort != null && serialPort.isOpened()) { 
     serialPort.writeByte((byte)(data & 0xFF)); 
    } else { 
     Log.e(TAG, "cannot write to serial port."); 
     throw new IOException("serial port is closed."); 
    } 
    // you may also override write(byte[], int, int) 
} 

Перед тем, как создать экземпляр Xmodem объекта, вы должны создать оба потока:

// omitted serialPort initialization 
InputStream pin = new PortInputStream(); 
serialPort.addEventListener(pin, SerialPort.MASK_RXCHAR); 
OutPutStream pon = new PortOutputStream(serialPort); 

Xmodem xmodem = new Xmodem(pin,pon); 
Смежные вопросы