串口连接好了,剩下的就是写程序了
1.准备
下载Communication包
下载地址如下:http://mdubuc.freeshell.org/Jolt/javacomm20-win32.zip.
2.配置
解压缩javacomm20-win32.zip
把win32com.dll拷贝到{JAVA_HOME}\jre\bin
把comm.jar拷贝到{JAVA_HOME}\jre\lib\ext
把javax.comm.properties拷贝到{JAVA_HOME}\jre\lib
再环境变量的CLASSPATH中添加一项:{JAVA_HOME}\jre\lib\ext\comm.jar;
我的CLASSPATH添加后为:
.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\ext\comm.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\jtds.jar;%Tomcat_Home%\common\lib\servlet-api.jar;
3.列举出本机所有可用串口
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());
}
}
portChoice.select(parameters.getPortName());
}
以上代码可以列举出当前系统所有可用的串口名称,我的机器上输出的结果是COM3和COM4.
4.下载串口调试程序
下载地址:http://www.onlinedown.net/soft/54540.htm
安装后,它会自动辨认计算机的端口,如果电脑没有串口,会提示:"串口不存在,或被占用"
5.程序
package cn.edu.lzjtu.comm;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.TooManyListenersException;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
public class Readstr {
static String str = "000000";
public void init()
{
try{
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM3");
// 直接取得COM3端口
System.out.println(portId.getName()+":开启");
@SuppressWarnings("unused")
Read reader = new Read(portId);
}catch(Exception ex){
ex.printStackTrace();
}
}
class Read implements Runnable, SerialPortEventListener {
InputStream inputStream;
SerialPort serialPort;
Thread readThread;
public Read(CommPortIdentifier portId) throws InterruptedException {
try {
serialPort = (SerialPort) portId.open("MyReader", 2000);
//portId.open("串口所有者名称", 超时等待时间);
} catch (PortInUseException e) {
//如果端口被占用就抛出这个异常
e.printStackTrace();
}
try {
inputStream = serialPort.getInputStream();
//从COM3获取数据
} catch (IOException e) {}
try {
serialPort.addEventListener(this);
//添加监听器
} catch (TooManyListenersException e) {}
serialPort.notifyOnDataAvailable(true);
/* 侦听到串口有数据,触发串口事件*/
try {
serialPort.setSerialPortParams(9600,//波特率
SerialPort.DATABITS_8,//数据位数
SerialPort.STOPBITS_1,//停止位
SerialPort.PARITY_NONE);//校验
} catch (UnsupportedCommOperationException e) {}
readThread = new Thread(this);
readThread.start();
//启动线程
}
public void run() {
try {
Thread.sleep(30000);
serialPort.close();
System.out.println("COM3:关闭");
//设定30秒后端口关闭,程序随之结束
} catch (InterruptedException e) {}
}
/**
* BI -通讯中断。
CD -载波检测。
CTS -清除发送。
DATA_AVAILABLE -有数据到达。
DSR -数据设备准备好。
FE -帧错误。
OE -溢位错误。
OUTPUT_BUFFER_EMPTY -输出缓冲区已清空。
PE -奇偶校验错。
RI - 振铃指示。
一般最常用的就是DATA_AVAILABLE--串口有数据到达事件。
*/
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) {
int numBytes = inputStream.read(readBuffer);
//System.out.println("numBytes"+numBytes);
}
str = new String(readBuffer)。trim();
System.out.println(new String(readBuffer)。trim());
//输出读入的字符
} catch (IOException e) {}
break;
}
}
}
public static void main(String [] args)
{
Readstr reader = new Readstr();
reader.init();
}
}
//此程序只用于监听COM3端口,当程序执行时开启COM3端口,等待30秒后,端口COM3关闭,程序随之关闭
//Read 为内部类,这样可以共用读取出来的字符串信息
//在Readstr 中定义一个静态变量static String str = "000000";
//然后在读出数据后str = new String(readBuffer)。trim();
//这样可以在一个事件触发后,将str中的值赋给相应的值(比如说,让这个值显示在输入框中)
6.执行程序
执行上边的程序,打开超级超级串口调试器,选择除COM3以外的端口,波特率改为9600,因为上面的程序选择的是COM3端口,波特率为9600,也可以将上边程序端口改的别的,反正就是:这个串口调试程序占用一个端口,上边的执行程序再占用一个端口,两个端口不能为同一个,不然会出异常。
如图所示:点击手动发送,后台是不是输出数据了?呵呵
好了做到这里,我们可以在程序中读取出服务端的串口信息了。
但由于项目是B/S的,最终目的是读取出来每个登录客户端的串口信息