Привет, есть задача в приложении работать со сканером штрих-кода. Использую библиотеку RXTX, работает на ура за исключением одного момента - в программе я сделал настройку сканера (номер порта, скорость, префикс, суффикс), так вот если скорость настроена неправильно, например 4800, то мне не удаётся закрыть порт после теста. привожу код: | Код | private static ExecutorService pool = Executors.newCachedThreadPool(); private static InputStream in; private static OutputStream out; private static SerialPort serialPort; private static boolean running = false;
public static void connect(String portName, int portSpeed) throws Exception { CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); if(portIdentifier.isCurrentlyOwned()) System.out.println("Error: Port is currently in use"); else { System.out.println("OPENING PORT "+portName+"..."); commPort = portIdentifier.open(BarcodeReader.class.getName(),2000); if(commPort instanceof SerialPort) { running = true; serialPort = (SerialPort)commPort; serialPort.setSerialPortParams(portSpeed,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); in = serialPort.getInputStream(); out = serialPort.getOutputStream(); serialPort.notifyOnDataAvailable(true); serialPort.addEventListener(new SerialReader(in)); System.out.println("PORT "+portName+" IS OPEN ON SPEED "+portSpeed); }else System.out.println("Error: Only serial ports are handled by this example."); } }
public static class SerialReader implements SerialPortEventListener { private InputStream in; private byte[] buffer = new byte[1024];
public SerialReader(InputStream in) { this.in = in; }
@Override public void serialEvent(SerialPortEvent arg0) { System.out.println(arg0.getEventType()); int data; try { int len = 0; while(running && (data = in.read()) > -1) { System.out.println((char)data); if(data == '\n') { break; } buffer[len++] = (byte) data; } System.out.println(new String(buffer,0,len)); }catch(IOException e) { Messanger.showErrorMessage(e); } } }
public static void close() { pool.submit(new Runnable() { @Override public void run() { if(serialPort != null) { running = false; listeners.clear(); try{ in.close(); out.close(); }catch(IOException ex) { Messanger.showErrorMessage(ex); } System.out.println("closing..."); serialPort.removeEventListener(); System.out.println("closing serial port..."); serialPort.close(); System.out.println("finished closing"); } } }); }
|
Подскажите, может я что то неправильно сделал? Ну очень надо)
|