三、实例
(1)打开、关闭串口
首先使用CommPortIdentifier中的方法,获取可用的端口,并且选择一个端口打开作为通信端口。
A:枚举可用端口
| 1 | void listPortChoices() |
| 2 | { |
| 3 | CommPortIdentifier portId; |
| 4 | Enumeration en = CommPortIdentifier.getPortIdentifiers(); |
| 5 | while (en.hasMoreElements()) |
| 6 | { |
| 7 | portId = (CommPortIdentifier) en.nextElement(); |
| 8 | if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) |
| 9 | System.out.println(portId.getName()); |
| 10 | } |
| 11 | portChoice.select(parameters.getPortName()); |
| 12 | } |
| 13 | |
| 14 |
B:打开指定的端口
| 1 | CommPortIdentifier portId; |
| 2 | try |
| 3 | { |
| 4 | //生成CommPortIdentifier类的实例 |
| 5 | portId = CommPortIdentifier.getPortIdentifier("COM4"); |
| 6 | } |
| 7 | catch (NoSuchPortException e) |
| 8 | { |
| 9 | e.printStackTrace(); |
| 10 | } |
| 11 | try |
| 12 | { |
| 13 | //打开串口COM4,设置超时时限为3000毫秒 |
| 14 | serialPort = (SerialPort) portId.open("testApp", 3000); |
| 15 | } |
| 16 | catch (PortInUseException e) |
| 17 | { |
| 18 | e.printStackTrace(); |
| 19 | } |
| 20 | |
| 21 |
C:关闭端口
使用完的端口,必须记得将其关闭,否则其它的程序将无法使用该端口,CommPortIdentifier类只提供了开启端口的方法,而要关闭端口,则要调用CommPort类的close()方法。
serialPort.close()
(2)设置串口参数
| 1 | try { |
| 2 | try { |
| 3 | serialPort.setSerialPortParams(9600, // 波特率 |
| 4 | SerialPort.DATABITS_8,// 数据位数 |
| 5 | SerialPort.STOPBITS_1, // 停止位 |
| 6 | SerialPort.PARITY_NONE);// 奇偶位 |
| 7 | } |
| 8 | catch (UnsupportedCommOperationException e) |
| 9 | { |
| 10 | e.printStackTrace(); |
| 11 | } |
| 12 |
(3)串口的读、写
A:向串口写数据
| 1 | OutputStream outputStream; |
| 2 | try |
| 3 | { |
| 4 | outputStream = serialPort.getOutputStream(); |
| 5 | } |
| 6 | catch (IOException e) |
| 7 | { |
| 8 | e.printStackTrace(); |
| 9 | } |
| 10 | bt = new byte[] { (byte) 0x55, (byte) 0xAA, (byte) 0xF1 }; |
| 11 | try |
| 12 | { |
| 13 | outputStream.write(bt); |
| 14 | outputStream.flush(); |
| 15 | outputStream.close(); |
| 16 | } |
| 17 | catch (IOException e) |
| 18 | { |
| 19 | e.printStackTrace(); |
| 20 | } |
| 21 |
B:读取串口中的数据
读操作,需继承SerialPortEventListener接口。为SerialPort添加监听Listener。实现该接口的serialEvent (SerialPortEvent event)方法。
| 1 | public class SerialRead implements SerialPortEventListener{ |
| 2 | |
| 3 | InputStream inputStream; |
| 4 | byte[] rBuffer = new byte[38]; |
| 5 | SerialRead(SerialPort serialPort) |
| 6 | { |
| 7 | try { |
| 8 | serialPort.addEventListener((SerialPortEventListener) this); |
| 9 | this.serialPort.notifyOnDataAvailable(true); |
| 10 | |
| 11 | } catch (TooManyListenersException e) { |
| 12 | } |
| 13 | |
| 14 | try { |
| 15 | if (serialPort != null) |
| 16 | inputStream = serialPort.getInputStream(); |
| 17 | } catch (IOException e) { |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | public void serialEvent(SerialPortEvent event) |
| 22 | { |
| 23 | if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) |
| 24 | { |
| 25 | int count = 0; |
| 26 | try |
| 27 | { |
| 28 | while ((ch = inputStream.read()) != -1) |
| 29 | { |
| 30 | bt[count++]=(byte)ch; |
| 31 | } |
| 32 | } |
| 33 | catch (IOException e) |
| 34 | { |
| 35 | e.printStackTrace(); |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 |
浙公网安备 33010602011771号