java实现串口通信简单实例潘伟1.docx
- 文档编号:8192270
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:10
- 大小:22.43KB
java实现串口通信简单实例潘伟1.docx
《java实现串口通信简单实例潘伟1.docx》由会员分享,可在线阅读,更多相关《java实现串口通信简单实例潘伟1.docx(10页珍藏版)》请在冰豆网上搜索。
java实现串口通信简单实例潘伟1
Java实现串口通信简单实例
前言
本文档是基于对常用的RS232串行端口进行的测试结果
1、下载java串口包
sun的官方下载 只提供solaris平台x86/sparc 架构及linux平台x86架构的扩展API,目前最新版本为3.0。
windows平台的扩展包到以下地址下载,http:
//llk.media.mit.edu/projects/cricket/software/javaSerial.zip(两个文件夹里面有所需的3个文件),http:
//mdubuc.freeshell.org/Jolt/javacomm20-win32.zip和(完整的2.0版本,还有examples)。
因为实在winxp平台中进行的开发测试,我下载的是javaSerial.zip,解压后有两个文件夹putInBin和putInLib,分别存放的是win32com.dll和comm.jar与m.properties文件。
2、配置java串口包
将解压得到的三个文件分别放入以下位置,
m.properties-------->%JAVA_HOME%/jre/lib
comm.jar-------->%JAVA_HOME%/jre/lib/ext
win32com.dll-------->%JAVA_HOME%/jre/bin
如果应用程序提示找不到串口,解决这个问题的方法很简单,我们只须将上面提到的文件放到JRE相应的目录下就可以了。
3、串口API简介
3.1 m.CommPort
这是用于描述一个被底层系统支持的端口的抽象类。
它包含一些高层的IO控制方法,这些方法对于所有不同的通讯端口来说是通用的。
SerialPort和ParallelPort都是它的子类,前者用于控制串行端口而后者用于控这并口,二者对于各自底层的物理端口都有不同的控制方法。
这里我们只关心SerialPort。
3.2 m.CommPortIdentifier
这个类主要用于对串口进行管理和设置,是对串口进行访问控制的核心类。
主要包括以下方法
确定是否有可用的通信端口;
为IO操作打开通信端口;
决定端口的所有权;
处理端口所有权的争用;
管理端口所有权变化引发的事件(Event)。
3.3 m.SerialPort
这个类用于描述一个RS-232串行通信端口的底层接口,它定义了串口通信所需的最小功能集。
通过它,用户可以直接对串口进行读、写及设置工作。
4、测试代码
4.1简单测试代码
/**
*@Project:
Test
*@Title:
SimpleRead.java
*@PackageTestSimpleRead
*@Description:
TODO
*@createAuthor:
AlbertPan
*@createDate:
2013-1-17上午10:
03:
02
*@Copyright:
2013四川久远新方向
*@versionV1.0
*/
packageTestSimpleRead;
importjava.io.*;
importjava.util.*;
importm.*;
publicclassSimpleReadimplementsRunnable,SerialPortEventListener{
staticCommPortIdentifierportId;
staticEnumerationportList;
InputStreaminputStream;
SerialPortserialPort;
ThreadreadThread;
publicstaticvoidmain(String[]args){
portList=CommPortIdentifier.getPortIdentifiers();
while(portList.hasMoreElements()){
portId=(CommPortIdentifier)portList.nextElement();
System.out.println("port"+portId.getName());
if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL){
if(portId.getName().equals("COM1")){
//if(portId.getName().equals("/dev/term/a")){
SimpleReadreader=newSimpleRead();
}
}
}
}
publicSimpleRead(){
try{
serialPort=(SerialPort)portId.open("SimpleReadApp",2000);
}catch(PortInUseExceptione){}
try{
inputStream=serialPort.getInputStream();
}catch(IOExceptione){}
try{
serialPort.addEventListener(this);
}catch(TooManyListenersExceptione){}
serialPort.notifyOnDataAvailable(true);
try{
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
}catch(UnsupportedCommOperationExceptione){}
readThread=newThread(this);
readThread.start();
}
publicvoidrun(){
try{
Thread.sleep(20000);
}catch(InterruptedExceptione){}
}
publicvoidserialEvent(SerialPortEventevent){
switch(event.getEventType()){
caseSerialPortEvent.BI:
caseSerialPortEvent.OE:
caseSerialPortEvent.FE:
caseSerialPortEvent.PE:
caseSerialPortEvent.CD:
caseSerialPortEvent.CTS:
caseSerialPortEvent.DSR:
caseSerialPortEvent.RI:
caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
caseSerialPortEvent.DATA_AVAILABLE:
byte[]readBuffer=newbyte[20];
try{
while(inputStream.available()>0){
intnumBytes=inputStream.read(readBuffer);
}
System.out.print(newString(readBuffer));
}catch(IOExceptione){}
break;
}
}
}
测试结果
4.2应用测试:
windows中java实现的串口通信
java实现源程序如下
------------------1---------------------
packageserial;
importgnu.io.SerialPort;
importjava.util.HashMap;
publicclassCommTest{
/**
*windows中串口通信程序需要rxtxSerial.dll的支持,放到D:
\jdk1.5\bin目录下即可
*/
publicstaticvoidmain(String[]args){
HashMap
params.put(SerialReader.PARAMS_PORT,"COM8");//端口名称
params.put(SerialReader.PARAMS_RATE,9600);//波特率
params.put(SerialReader.PARAMS_TIMEOUT,1000);//设备超时时间1秒
params.put(SerialReader.PARAMS_DELAY,200);//端口数据准备时间1秒
params.put(SerialReader.PARAMS_DATABITS,SerialPort.DATABITS_8);//数据位
params.put(SerialReader.PARAMS_STOPBITS,SerialPort.STOPBITS_1);//停止位
params.put(SerialReader.PARAMS_PARITY,SerialPort.PARITY_NONE);//无奇偶校验
SerialReadersr=newSerialReader(params);
CommDataObserverbob=newCommDataObserver("bob");
CommDataObserverjoe=newCommDataObserver("joe");
sr.addObserver(joe);
sr.addObserver(bob);
}
}
----------------2-----------------
packageserial;
importgnu.io.CommPort;
importgnu.io.CommPortIdentifier;
importgnu.io.NoSuchPortException;
importgnu.io.PortInUseException;
importgnu.io.SerialPort;
importgnu.io.SerialPortEvent;
importgnu.io.SerialPortEventListener;
importgnu.io.UnsupportedCommOperationException;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Enumeration;
importjava.util.HashMap;
importjava.util.HashSet;
importjava.util.Observable;
importjava.util.TooManyListenersException;
/**
*串口数据读取类,用于windows的串口数据读取
*
*/
publicclassSerialReaderextendsObservableimplementsRunnable,SerialPortEventListener{
staticCommPortIdentifierportId;
intdelayRead=200;
intnumBytes;//buffer中的实际数据字节数
privatestaticbyte[]readBuffer=newbyte[4096];//4k的buffer空间,缓存串口读入的数据
staticEnumerationportList;
InputStreaminputStream;
SerialPortserialPort;
HashMapserialParams;
//端口读入数据事件触发后,等待n毫秒后再读取,以便让数据一次性读完
publicstaticfinalStringPARAMS_DELAY="delayread";//延时等待端口数据准备的时间
publicstaticfinalStringPARAMS_TIMEOUT="timeout";//超时时间
publicstaticfinalStringPARAMS_PORT="portname";//端口名称
publicstaticfinalStringPARAMS_DATABITS="databits";//数据位
publicstaticfinalStringPARAMS_STOPBITS="stopbits";//停止位
publicstaticfinalStringPARAMS_PARITY="parity";//奇偶校验
publicstaticfinalStringPARAMS_RATE="rate";//波特率
/**
*初始化端口操作的参数.
*@see
*/
publicSerialReader(HashMapparams){
serialParams=params;
init();
}
privatevoidinit(){
try{
//参数初始化
inttimeout=Integer.parseInt(serialParams.get(PARAMS_TIMEOUT).toString());
intrate=Integer.parseInt(serialParams.get(PARAMS_RATE).toString());
intdataBits=Integer.parseInt(serialParams.get(PARAMS_DATABITS).toString());
intstopBits=Integer.parseInt(serialParams.get(PARAMS_STOPBITS).toString());
intparity=Integer.parseInt(serialParams.get(PARAMS_PARITY).toString());
delayRead=Integer.parseInt(serialParams.get(PARAMS_DELAY).toString());
Stringport=serialParams.get(PARAMS_PORT).toString();
//打开端口
portId=CommPortIdentifier.getPortIdentifier(port);
serialPort=(SerialPort)portId.open("SerialReader",timeout);
inputStream=serialPort.getInputStream();
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
serialPort.setSerialPortParams(rate,dataBits,stopBits,parity);
}catch(PortInUseExceptione){
System.out.println("端口已经被占用!
");
e.printStackTrace();
}catch(TooManyListenersExceptione){
System.out.println("端口监听者过多!
");
e.printStackTrace();
}catch(UnsupportedCommOperationExceptione){
System.out.println("端口操作命令不支持!
");
e.printStackTrace();
}catch(NoSuchPortExceptione){
System.out.println("端口不存在!
");
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
ThreadreadThread=newThread(this);
readThread.start();
}
/**
*Methoddeclaration
*@see
*/
publicvoidrun(){
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
}
}
/**
*Methoddeclaration
*@paramevent
*
*@see
*/
publicvoidserialEvent(SerialPortEventevent){
try{
//等待1秒钟让串口把数据全部接收后在处理
Thread.sleep(delayRead);
System.out.print("serialEvent["+event.getEventType()+"]");
}catch(InterruptedExceptione){
e.printStackTrace();
}
switch(event.getEventType()){
caseSerialPortEvent.BI:
//10
caseSerialPortEvent.OE:
//7
caseSerialPortEvent.FE:
//9
caseSerialPortEvent.PE:
//8
caseSerialPortEvent.CD:
//6
caseSerialPortEvent.CTS:
//3
caseSerialPortEvent.DSR:
//4
caseSerialPortEvent.RI:
//5
caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:
//2
break;
caseSerialPortEvent.DATA_AVAILABLE:
//1
try{
//多次读取,将所有数据读入
//while(inputStream.available()>0){
//numBytes=inputStream.read(readBuffer);
//}
numBytes=inputStream.read(readBuffer);
changeMessage(readBuffer,numBytes);
}catch(IOExceptione){
e.printStackTrace();
}
break;
}
}
//通过observerpattern将收到的数据发送给observer
//将buffer中的空字节删除后再发送更新消息,通知观察者
publicvoidchangeMessage(byte[]message,intlength){
setChanged();
byte[]temp=newbyte[length];
System.arraycopy(message,0,temp,0,length);
//System.out.println("msg["+numBytes+"]:
["+newString(temp)+"]");
notifyObservers(temp);
}
staticvoidlistPorts(){
EnumerationportEnum=CommPortIdentifier.getPortIdentifiers();
while(portEnum.hasMoreElements()){
CommPortIdentifierportIdentifier=(CommPortIdentifier)portEnum.nextElement();
System.out.println(portIdentifier.getName()+"-"
+getPortTypeName(portIdentifier.getPortType()));
}
}
staticStringgetPortTypeName(intportType){
switch(portType){
caseCommPortIdentifier.PORT_I2C:
return"I2C";
caseCommPortIdentifier.PORT_PARALLEL:
return"Parallel";
caseCommPortIdentifier.PORT_RAW:
return"Raw";
caseCommPortIdentifier.PORT_RS485:
return"RS485";
caseCommPortIdentifier.PORT_SERIAL:
return"Serial";
default:
return"unknowntype";
}
}
/**
*@returnAHashSetcontainingtheCommPortIdentifierforallserialportsthatarenotcurrentlybeingused.
*/
publicstaticHashSet
HashSet
EnumerationthePorts=CommPortIdentifier.getPortIdentifiers();
whi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 实现 串口 通信 简单 实例