资源描述
为了更好地查瞧本文档,请打开word得文档结构视图。
修订控制页
1
2012-9-13
新建
曾行明
1、0
目录
修订控制页 3
目录 4
1、 概述 5
2、 搭建环境 5
2、1 开发环境 5
2、2 扩展包安装 5
2、3 accessPort 得使用 5
2、4 使用串口调试工具查瞧端口通信 7
3、 编写java串口操作类 7
3、1 串口操作得封装类 7
3、2 main程序 13
4、 运行java程序测试串口通信 13
4、1 打开端口 13
4、2 开启java程序得数据监听、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、14
1、 概述
使用java进行串口通讯。
2、 搭建环境
2、1 开发环境
本次测试使用得环境:
Win 7 旗舰版 64位
Eclipse 3、7
Java 1、6
Comm2、0、jar(串口通信得扩展库)
AccessPort 1、37
串口调试工具(精装版V3、6)
VSPD 工具 (创建虚拟串口用)
注:
1. 因为操作系统就是64位得win7,accessport 使用得就是 1、37
2. Comm包就是一个扩展包,需要放置到jre得lib/ext 目录下
3. 关于创建虚拟串口与串口调试工具得使用请参考:
2、2 扩展包安装
扩展包安装如下:
下载路径:
将下载得文件解压缩后,在/javacomm20-win32/commapi目录下有必需得三个文件comm、jar,javax、comm、 properties与win32comm、dll。将文件comm、jar拷贝到%JAVA_HOME%/jre/lib/ext;文件javax、comm、 properties拷贝到%JAVA_HOME%/jre/lib; 文件win32comm、dll拷贝到%JAVA_HOME%/bin。注意%JAVA_HOME%就是jdk得路径,而非jre。
2、3 accessPort 得使用
打开软件,使用默认得配置就好了:
A 选择端口
B 开户端口监听
C 停止监听
最后点击 上面得蓝色 按钮使用端口。
2、4 使用串口调试工具查瞧端口通信
我们使用VSPD建立两个虚拟串口,这两个就是数据连通得。
这里我创建得就是 COM2 、COM3
在java程序中监听COM2,那么通过java程序发送得数据会发送到 COM3,从COM3中发送来得数据会被java程序监听到。
所以这时我们只需要用“串口调试工具”连接到COM3就可以进行通信测试了。
2、3 小节讲到得 AccessPort 工具可以不用,也可以进行测试。
3. 编写java串口操作类
3、1 串口操作得封装类
package org、serial;
import java、io、BufferedInputStream;
import java、io、BufferedOutputStream;
import java、io、IOException;
import java、io、InputStream;
import java、io、OutputStream;
import java、util、Enumeration;
import java、util、TooManyListenersException;
import javax、comm、CommPortIdentifier;
import javax、comm、PortInUseException;
import javax、comm、SerialPort;
import javax、comm、SerialPortEvent;
import javax、comm、SerialPortEventListener;
/**
* @项目名称 :illegalsms
* @文件名称 :SerialPort、java
* @所在包 :org、serial
* @功能描述 :
* 串口类
* @创建者 :集成显卡
* @创建日期 :2012-9-13
* @修改记录 :
*/
public class DSerialPort implements Runnable, SerialPortEventListener {
private String appName = "串口通讯测试[集成显卡2012]";
private int timeout = 2000;//open 端口时得等待时间
private int threadTime = 0;
private CommPortIdentifier commPort;
private SerialPort serialPort;
private InputStream inputStream;
private OutputStream outputStream;
/**
* @方法名称 :listPort
* @功能描述 :列出所有可用得串口
* @返回值类型 :void
*/
@SuppressWarnings("rawtypes")
public void listPort(){
CommPortIdentifier cpid;
Enumeration en = CommPortIdentifier、getPortIdentifiers();
System、out、println("now to list all Port of this PC:" +en);
while(en、hasMoreElements()){
cpid = (CommPortIdentifier)en、nextElement();
if(cpid、getPortType() == CommPortIdentifier、PORT_SERIAL){
System、out、println(cpid、getName() + ", " + cpid、getCurrentOwner());
}
}
}
/**
* @方法名称 :selectPort
* @功能描述 :选择一个端口,比如:COM1
* @返回值类型 :void
* @param portName
*/
@SuppressWarnings("rawtypes")
public void selectPort(String portName){
this、commPort = null;
CommPortIdentifier cpid;
Enumeration en = CommPortIdentifier、getPortIdentifiers();
while(en、hasMoreElements()){
cpid = (CommPortIdentifier)en、nextElement();
if(cpid、getPortType() == CommPortIdentifier、PORT_SERIAL
&& cpid、getName()、equals(portName)){
this、commPort = cpid;
break;
}
}
openPort();
}
/**
* @方法名称 :openPort
* @功能描述 :打开SerialPort
* @返回值类型 :void
*/
private void openPort(){
if(commPort == null)
log(String、format("无法找到名字为'%1$s'得串口!", commPort、getName()));
else{
log("端口选择成功,当前端口:"+commPort、getName()+",现在实例化 SerialPort:");
try{
serialPort = (SerialPort)commPort、open(appName, timeout);
log("实例 SerialPort 成功!");
}catch(PortInUseException e){
throw new RuntimeException(String、format("端口'%1$s'正在使用中!",
commPort、getName()));
}
}
}
/**
* @方法名称 :checkPort
* @功能描述 :检查端口就是否正确连接
* @返回值类型 :void
*/
private void checkPort(){
if(commPort == null)
throw new RuntimeException("没有选择端口,请使用 " +
"selectPort(String portName) 方法选择端口");
if(serialPort == null){
throw new RuntimeException("SerialPort 对象无效!");
}
}
/**
* @方法名称 :write
* @功能描述 :向端口发送数据,请在调用此方法前 先选择端口,并确定SerialPort正常打开!
* @返回值类型 :void
* @param message
*/
public void write(String message) {
checkPort();
try{
outputStream = new BufferedOutputStream(serialPort、getOutputStream());
}catch(IOException e){
throw new RuntimeException("获取端口得OutputStream出错:"+e、getMessage());
}
try{
outputStream、write(message、getBytes());
log("信息发送成功!");
}catch(IOException e){
throw new RuntimeException("向端口发送信息时出错:"+e、getMessage());
}finally{
try{
outputStream、close();
}catch(Exception e){
}
}
}
/**
* @方法名称 :startRead
* @功能描述 :开始监听从端口中接收得数据
* @返回值类型 :void
* @param time 监听程序得存活时间,单位为秒,0 则就是一直监听
*/
public void startRead(int time){
checkPort();
try{
inputStream = new BufferedInputStream(serialPort、getInputStream());
}catch(IOException e){
throw new RuntimeException("获取端口得InputStream出错:"+e、getMessage());
}
try{
serialPort、addEventListener(this);
}catch(TooManyListenersException e){
throw new RuntimeException(e、getMessage());
}
serialPort、notifyOnDataAvailable(true);
log(String、format("开始监听来自'%1$s'得数据--------------", commPort、getName()));
if(time > 0){
this、threadTime = time*1000;
Thread t = new Thread(this);
t、start();
log(String、format("监听程序将在%1$d秒后关闭。。。。", threadTime));
}
}
/**
* @方法名称 :close
* @功能描述 :关闭 SerialPort
* @返回值类型 :void
*/
public void close(){
serialPort、close();
serialPort = null;
commPort = null;
}
public void log(String msg){
System、out、println(appName+" --> "+msg);
}
/**
* 数据接收得监听处理函数
*/
@Override
public void serialEvent(SerialPortEvent arg0) {
switch(arg0、getEventType()){
case SerialPortEvent、BI:/*Break interrupt,通讯中断*/
case SerialPortEvent、OE:/*Overrun error,溢位错误*/
case SerialPortEvent、FE:/*Framing error,传帧错误*/
case SerialPortEvent、PE:/*Parity error,校验错误*/
case SerialPortEvent、CD:/*Carrier detect,载波检测*/
case SerialPortEvent、CTS:/*Clear to send,清除发送*/
case SerialPortEvent、DSR:/*Data set ready,数据设备就绪*/
case SerialPortEvent、RI:/*Ring indicator,响铃指示*/
case SerialPortEvent、OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空*/
break;
case SerialPortEvent、DATA_AVAILABLE:/*Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端*/
byte[] readBuffer = new byte[1024];
String readStr="";
String s2 = "";
try {
while (inputStream、available() > 0) {
inputStream、read(readBuffer);
readStr += new String(readBuffer)、trim();
}
s2 = new String(readBuffer)、trim();
log("接收到端口返回数据(长度为"+readStr、length()+"):"+readStr);
log(s2);
} catch (IOException e) {
}
}
}
@Override
public void run() {
try{
Thread、sleep(threadTime);
serialPort、close();
log(String、format("端口''监听关闭了!", commPort、getName()));
}catch(Exception e){
e、printStackTrace();
}
}
}
3、2 main程序
public class TestSerial {
public static final String PORT_NAME = "COM2";
public static final String OS = "window";//操作系统,可以就是 window,linux
public static void main(String[] args) {
DSerialPort sp = new DSerialPort();
sp、listPort();
sp、selectPort(PORT_NAME);
sp、write("210、36、16、166");
sp、write("2");
sp、startRead(60);
}
}
4、 运行java程序测试串口通信
4、1 打开端口
按照上面所说得,我得电脑中有两个虚拟串口:COM2,COM3
现在开始做测试。
用 串口测试工具 打开COM3:
这个就是与COM2 连通得
如果在java程序中调用COM2,发送数据,那么COM3会收到,在COM3 中发送得数据,java可以监听到。
4、2 开启java程序得数据监听
运行3、2节中得java 程序。
如下:
COM3中收到了信息:
一个信息就是 210、36、16、166
另外一个就是 2
然后,我们在 COM3 中给COM2 发送信息:
Java程序接受数据:
展开阅读全文