通过JAVA与串口(RS232)通信实例
文章分类: Java编程 关键字: java com 串口 rs232
最近了解到的需求是需要需激光打刻机进行(RS232)串口通信,
这里使用的是RXTX开源包实现的。
之前并没有用java做过串口通信,而且这方面资料不是很多。
项目实际应用中可能会采用VB开发(这个我就不会了)
只不过用java尝试一下,记个笔记,希望可以对相关开发用些帮助。
下面是实现代码
测试
这里使用的是RXTX开源包实现的。
之前并没有用java做过串口通信,而且这方面资料不是很多。
项目实际应用中可能会采用VB开发(这个我就不会了)
只不过用java尝试一下,记个笔记,希望可以对相关开发用些帮助。
下面是实现代码
- package test;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.util.Date;
- import java.util.Enumeration;
- import java.util.TooManyListenersException;
- import gnu.io.CommPortIdentifier;
- import gnu.io.PortInUseException;
- import gnu.io.SerialPort;
- import gnu.io.SerialPortEvent;
- import gnu.io.SerialPortEventListener;
- import gnu.io.UnsupportedCommOperationException;
- public class CommUtil implements SerialPortEventListener {
- InputStream inputStream; // 从串口来的输入流
- OutputStream outputStream; // 向串口输出的流
- SerialPort serialPort; // 串口的引用
- CommPortIdentifier portId;
- public CommUtil(Enumeration portList, String name) {
- while (portList.hasMoreElements()) {
- CommPortIdentifier temp = (CommPortIdentifier) portList.nextElement();
- if (temp.getPortType() == CommPortIdentifier.PORT_SERIAL) { // 判断如果端口类型是串口
- if (temp.getName().equals(name)) { // 判断如果端口已经启动就连接
- portId = temp;
- }
- }
- }
- try {
- serialPort = (SerialPort) portId.open( "My" +name, 2000 );
- } catch (PortInUseException e) {
- }
- try {
- inputStream = serialPort.getInputStream();
- outputStream = serialPort.getOutputStream();
- } catch (IOException e) {
- }
- try {
- serialPort.addEventListener( this ); // 给当前串口天加一个监听器
- } catch (TooManyListenersException e) {
- }
- serialPort.notifyOnDataAvailable( true ); // 当有数据时通知
- try {
- serialPort.setSerialPortParams( 2400 , SerialPort.DATABITS_8, // 设置串口读写参数
- SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
- } catch (UnsupportedCommOperationException e) {
- }
- }
- public void serialEvent(SerialPortEvent event) {
- switch (event.getEventType()) {
- case SerialPortEvent.BI:
- case SerialPortEvent.OE:
- case SerialPortEvent.FE:
- case SerialPortEvent.PE:
- case SerialPortEvent.CD:
- case SerialPortEvent.CTS:
- case SerialPortEvent.DSR:
- case SerialPortEvent.RI:
- case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
- break ;
- case SerialPortEvent.DATA_AVAILABLE: // 当有可用数据时读取数据,并且给串口返回数据
- byte [] readBuffer = new byte [ 20 ];
- try {
- while (inputStream.available() > 0 ) {
- System.out.println(inputStream.available());
- int numBytes = inputStream.read(readBuffer);
- System.out.println(numBytes);
- }
- System.out.println( new String(readBuffer).trim());
- } catch (IOException e) {
- e.printStackTrace();
- }
- break ;
- }
- }
- public void send(String content){
- try {
- outputStream.write(content.getBytes());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void ClosePort() {
- if (serialPort != null ) {
- serialPort.close();
- }
- }
- }
package test; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Date; import java.util.Enumeration; import java.util.TooManyListenersException; import gnu.io.CommPortIdentifier; import gnu.io.PortInUseException; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import gnu.io.UnsupportedCommOperationException; public class CommUtil implements SerialPortEventListener { InputStream inputStream; // 从串口来的输入流 OutputStream outputStream;// 向串口输出的流 SerialPort serialPort; // 串口的引用 CommPortIdentifier portId; public CommUtil(Enumeration portList, String name) { while (portList.hasMoreElements()) { CommPortIdentifier temp = (CommPortIdentifier) portList.nextElement(); if (temp.getPortType() == CommPortIdentifier.PORT_SERIAL) {// 判断如果端口类型是串口 if (temp.getName().equals(name)) { // 判断如果端口已经启动就连接 portId = temp; } } } try { serialPort = (SerialPort) portId.open("My"+name, 2000); } catch (PortInUseException e) { } try { inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) { } try { serialPort.addEventListener(this); // 给当前串口天加一个监听器 } catch (TooManyListenersException e) { } serialPort.notifyOnDataAvailable(true); // 当有数据时通知 try { serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8, // 设置串口读写参数 SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { } } public void serialEvent(SerialPortEvent event) { switch (event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据,并且给串口返回数据 byte[] readBuffer = new byte[20]; try { while (inputStream.available() > 0) { System.out.println(inputStream.available()); int numBytes = inputStream.read(readBuffer); System.out.println(numBytes); } System.out.println(new String(readBuffer).trim()); } catch (IOException e) { e.printStackTrace(); } break; } } public void send(String content){ try { outputStream.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); } } public void ClosePort() { if (serialPort != null) { serialPort.close(); } } }
测试
- package test;
- import gnu.io.CommPortIdentifier;
- import java.util.Enumeration;
- public class Test {
- public static void main(String[] args) throws InterruptedException {
- Enumeration portList = CommPortIdentifier.getPortIdentifiers(); //得到当前连接上的端口
- CommUtil comm3 = new CommUtil(portList, "COM3" );
- int i = 0 ;
- while (i< 5 )
- {
- Thread.sleep( 3000 );
- comm3.send( "hello" );
- i++;
- }
- comm3.ClosePort();
- }
- }
package test; import gnu.io.CommPortIdentifier; import java.util.Enumeration; public class Test { public static void main(String[] args) throws InterruptedException { Enumeration portList = CommPortIdentifier.getPortIdentifiers(); //得到当前连接上的端口 CommUtil comm3 = new CommUtil(portList,"COM3"); int i = 0; while(i<5) { Thread.sleep(3000); comm3.send("hello"); i++; } comm3.ClosePort(); } }