Java要进行串口开发,不多bb直接开始把。先要有思路
1,我们现在很多笔记本或者电脑是没有串口的,所以你要先确定你的电脑上是不是又串口
2,没有串口也不用着急,又usb接口就可以读写串口,因为有个东西叫做usb转串口的一个线
3,当然要用java读取电脑的硬件(串口),肯定也少不了jar包的支持
4,但凡涉及到数据的交互的,都离不开输入输出流这个东西。
所以总结一下大概就是,先找个串口连接到自己的电脑上,如果电脑上没有串口孔,那就买个usb转串口设备,
连接到电脑上后,然后下个jar包。下载地址:点击打开链接 这个是我在网上找的应该是官网的下载地址,如果
觉得英文麻烦,那么你也可以在网上搜,很多需要十多个积分的下载的地址去下吧,反正都一样。
好吧,都整好了,
拷贝 RXTXcomm.jar 到 JAVA_HOME\jre\lib\ext目录中;
拷贝 rxtxSerial.dll 到 JAVA_HOME\jre\bin目录中;
拷贝 rxtxParallel.dll 到 JAVA_HOME\jre\bin目录中;JAVA_HOME为jdk安装路径
好!到这儿环境就已经好了 ,串口开发需要的外部东西已经准备好了,接下来就是代码copy开始了
package com.stylefeng.guns.modular.RDT_data.utils; /** * @ClassName ThrClass * @Description TODO * @EMAIL [email protected] * @DATE 2018/6/312:16 * @Version 1.0 */ import com.alibaba.fastjson.JSONObject; import gnu.io.*; import org.omg.Messaging.SYNC_WITH_TRANSPORT; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.imageio.ImageIO; import javax.imageio.stream.FileImageOutputStream; import java.awt.image.BufferedImage; import java.io.*; import java.lang.reflect.Array; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.TooManyListenersException; public class RdtBaseUtil implements SerialPortEventListener { protected static CommPortIdentifier portid = null; //通讯端口标识符 protected static SerialPort comPort = null; //串行端口 protected int BAUD = 115200; //波特率 protected int DATABITS = SerialPort.DATABITS_8; ; //数据位 protected int STOPBITS = SerialPort.STOPBITS_1; //停止位 protected int PARITY = SerialPort.PARITY_NONE; //奇偶检验 public static OutputStream oStream; //输出流 public static InputStream iStream; //输入流 /** * 读取所有串口名字 */ private void listPortChoices() { CommPortIdentifier portId; Enumeration en = CommPortIdentifier.getPortIdentifiers(); // iterate through the ports. while (en.hasMoreElements()) { portId = (CommPortIdentifier) en.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { System.out.println(portId.getName()); } } } /** * 设置串口号 * * @param * @return */ public void setSerialPortNumber() { String osName = null; String osname = System.getProperty("os.name", "").toLowerCase(); if (osname.startsWith("windows")) { // windows osName = "COM3"; } else if (osname.startsWith("linux")) { // linux osName = "/dev/ttyS1"; } System.out.println(osName); try { portid = CommPortIdentifier.getPortIdentifier(osName); // portid = CommPortIdentifier.getPortIdentifier(Port); if (portid.isCurrentlyOwned()) { System.out.println("端口在使用"); } else { comPort = (SerialPort) portid.open(this.getClass().getName(), 1000); } } catch (PortInUseException e) { System.out.println("端口被占用"); e.printStackTrace(); } catch (NoSuchPortException e) { System.out.println("端口不存在"); e.printStackTrace(); } try { iStream = comPort.getInputStream(); //从COM1获取数据 oStream = comPort.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } try { comPort.addEventListener(this); //给当前串口增加一个监听器 comPort.notifyOnDataAvailable(true); //当有数据是通知 } catch (TooManyListenersException e) { e.printStackTrace(); } try { //设置串口参数依次为(波特率,数据位,停止位,奇偶检验) comPort.setSerialPortParams(this.BAUD, this.DATABITS, this.STOPBITS, this.PARITY); } catch (UnsupportedCommOperationException e) { System.out.println("端口操作命令不支持"); e.printStackTrace(); } } @Override 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:// 当有可用数据时读取数据,并且给串口返回数据 //进来后 就不是第一次了 //TODO break; } } }
上面就是大家最喜欢的部分了,拷到项目中,首先编译通过,然后运行,当然里面的参数,或者串口名称这些还是要根据实际情况修改一下,然后后面的事情,想怎么封装就怎么封装,核心就是里面的一个输入流和输出流,通过这两个流就可以和串口设备进行通信了。