使用java进行串口通信确实不是串口通讯操作的主流方法,另外写好的的java程序无法随意的迁移。不过对熟悉java的同学确实挺有帮助,下面是我使用java语言进行串口通讯的过程。
1 usb转串口安装。
2 jar包的安装。
3 java代码的实现。
usb转串口的安装。
一般把串口线插上电脑就会提示安装驱动,在网上下一个串口驱动就会成功了。可我的电脑却怎么也成功不了,在网上找了各种方法就是不行(我的系统是win7)。更有不靠谱的说法是重装系统。总之试变了网上的驱动,还用什么驱动精灵之类的都把还是没有成功。打开设备管理器,usb-serial controller总是有×××的叹号。
我的解决方法。
运行-》输入hdwwiz-》下一步选择安装我手动列表中选择硬件(高级)-》下一步选择端口(com和lpt)-》下一步选择public-》然后选择第一个public ............->再点击下一步进行安装。
最后终于成功了。
安装jar包
安装jar包和我们平常的引入jar包不太一样。附件是用到的jar包。
首先把RXTXcomm.jar放入所用jre的lib目录下,把rxtxSerial.dll放到jre的bin目录下就可以了。
代码实现
主要是两步第一步查到所使用的com口。第二步对串口进行监听。
具体的代码如下:
import java.io.*;
import java.util.*;
import test.FeelTheBase;
import test.SimpleReadA;
import gnu.io.*;
public class SimpleRead implements SerialPortEventListener { // SerialPortEventListener
// 监听器,我的理解是独立开辟一个线程监听串口数据
public CommPortIdentifier portId; // 串口通信管理类
static Enumeration portList; // 已经连接上的端口的枚举
public InputStream inputStream; // 从串口来的输入流
public InputStreamReader streamReader;
public OutputStream outputStream;// 向串口输出的流
public OutputStreamWriter streamwriter;
public SerialPort serialPort; // 串口的引用
public void init() {
try {
serialPort = (SerialPort) portId.open(s, 2000);// 打开串口名字为myapp,延迟为2毫秒
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
serialPort.addEventListener(this); // 给当前串口天加一个监听器
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
catch (TooManyListenersException e) {
}
serialPort.notifyOnDataAvailable(true); // 当有数据时通知
try {
serialPort.setSerialPortParams(57600, SerialPort.DATABITS_8, // 设置串口读写参数
SerialPort.STOPBITS_1, SerialPort.PARITY_ODD);
} catch (UnsupportedCommOperationException e) {
}
}
public void serialEvent(SerialPortEvent event) {// SerialPortEventListener
// 的方法,监听的时候会不断执行
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:// 当有可用数据时读取数据,并且给串口返回数据
try {
while (inputStream.available() > 0) {
byte[] by = new byte[inputStream.available()];
inputStream.read(by);
System.out.println(by);//获得的数据
}
} catch (IOException e) {
}
break;
}
}
public static void main(String[] args) {
SimpleRead com3 = new SimpleRead();
try {
portList = CommPortIdentifier.getPortIdentifiers(); // 得到当前连接上的端口
while (portList.hasMoreElements()) {
CommPortIdentifier p = (CommPortIdentifier) portList
.nextElement();
if (p.getPortType() == CommPortIdentifier.PORT_SERIAL) {// 判断如果端口类型是串口
if (p.getName().equals("COM25")) { // 判断如果COM3端口已经启动就连接
com3.setCom(p);
com3.setOther(com5);
System.out.println(p.getName());
}
}
}
com3.init(); // 实例一个;
} catch (Exception e) {
e.printStackTrace();
}
}
}