我使用jssc库通过串口与设备通信。 在标准的java SerialComm库中,有两个方法getInputStream()和getOutputStream()。
为什么我需要这个?我想根据this示例实现Xmodem,而xmodem构造函数需要两个参数:
public Xmodem(InputStream inputStream, OutputStream outputStream)
{
this.inputStream = inputStream;
this.outputStream = outputStream;
}
Xmodem xmodem = new Xmodem(serialPort.getInputStream(),serialPort.getOutputStream());
在jssc中没有这样的方法,但我想知道是否有其他方法?
答案 0 :(得分:1)
一种可能性是提供扩展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) {
// exception handling
}
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 {
// exception handling
}
// 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);
对象之前,必须创建两个流:
foreach (var item in Model)
{
<input type="checkbox" name="BooksToCart" id="BooksToCart-@item.BookId" value="@item.BookId">
<input type="number" name="NoBooksToCart" id="NoBooksToCart-@item.BookId">
}