java串口编程java串口通信监听者模式解析.docx
《java串口编程java串口通信监听者模式解析.docx》由会员分享,可在线阅读,更多相关《java串口编程java串口通信监听者模式解析.docx(10页珍藏版)》请在冰豆网上搜索。
java串口编程java串口通信监听者模式解析
java调用coms端口串口通信的方法。
首先需要下到串口驱动。
javacomm20-win32.zip
去sun的主页应该有下的。
在这个驱动中有comm.jar,m.properties,win32com.dll
这么3个重要的文件。
1、首先配置驱动,把m.properties,win32com.dll拷贝到你的jdk中
具体位置为C:
\ProgramFiles\Java\jdk1.6.0_06\bin
然后配置windows系统环境变量,在path中加入C:
\ProgramFiles\Java\jdk1.6.0_06\bin;
打开你的java工程,配置userlibrary,并导入comm.jar包。
2、现在就可以开始写代码了。
串口读写代码如下
CommPortIdentifierportID=CommPortIdentifier.getPortIdentifier(com);//1,先拿到Identifier
//其中com是String类型的,传入的是串口名com="COM1";
SerialPortport=(SerialPort)portID.open("MyComm",100000000);//2,打开串口
//"MyComm"是串口名,100000000是串口过期时间(ms)。
port.setSerialPortParams(rate,databits,stopbit,parity);//3,设置串口属性
//rate波特率(默认9600),databits载波位(默认8),stopbit停止位(默认1),parity校验位(默认0无校验)
port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);//4(可选)设置数据流控制模式,默认为无
port.close();//关闭串口
3、串口读入写出流。
OutputStreamos=port.getOutputStream();//拿到写出流。
写出流就随便写就行。
port.getOutputStream().flush();//写完要记得做一次冲一下缓冲区
InputStreamis=port.getInputStream();//拿到读入流。
is.read();//每次读入一个int,这个是个阻塞函数,在无数据的时候会中断。
4、串口读入轮询模式
一种读取的方式是每次做
byteb[]=newbyte[1024];
is.read(b);
如果返回的是-1表示无数据。
可以中断几毫秒然后再去读。
比较低效的一种读取模式,但是在使用阻塞函数的时候还是很好用的。
5、串口的监听模式
//5.1首先建立监听类
publicclassCommListenerimplementsSerialPortEventListener
//继承自m.SerialPortEventListener;
//实现监听方法publicvoidserialEvent(SerialPortEventarg0){}
当有新数据进入的时候会被调用,传入m.SerialPortEvent对象参数。
if(arg0.getEventType()==SerialPortEvent.DATA_AVAILABLE)//如果是有效数据的话就做read
{
//read();
}
//5.2建立好监听类以后要在port上添加。
port.addEventListener(commListener);
//其中port是上文打开的串口端口,commListener是上文的监听器实例
port.notifyOnDataAvailable(true);//设置监听模式为当有数据到达时唤醒监听线程。
//千万注意一定要有这句代码,其他很多博文都没有介绍这个。
没这句话就不会唤醒监听线程了。
java操作com串口配置的一些问题
2010-08-1117:
24
从来没想过用java来操作底层!
昨天接到一个小项目!
从底层的串口读取数据,然后用web页面显示出来!
很明显用C可以很好的处理底层的交互!
可是对于web习惯也熟悉了jsp,所以想用java来处理串口!
Google一下java和串口,可以找到很多关于java处理串口的文章,其中离不开两个技术一个是用sun提供的comm.jar,一个是RXTX提供的RXTXcomm.jar,其中后者是对前者完全的覆盖!
不过麻烦的是这两个都需要安装,我的问题就是出在这里!
配置了一个晚上不仅一团糟,而且还没办法运行,现在把几个可能遇到的问题总结下:
1.首先需要弄清楚jdk和jre这两者的关系,要明白编译时候和运行时环境不同,一般安装jdk会有两个jre,而jre就是java程序运行时应该提供的环境,安装完jdk在java的目录下一般有两个文件夹jdk1.6.0_03和jre1.6.0_03,在jdk1.6.0_03目录下也有个jre目录,这是因为jdk工具本身就是一个java的程序,所以他自己运行也需要jre的环境,那么本机运行java程序到底是哪个jre在作用?
这个问题必须要搞清楚!
这时候环境变量设置就有了作用一个是PATH,一个CLSASSPATH,这两个的设置就关系到底是哪个jre在作用,还有一个比较土的办法是修改其中一个jre名字,然后看是哪个使得java程序运行不正常即可!
要搞清楚jre原因是因为comm.jar的程序运行需要在jre增加一些文件。
2.配置comm.jar环境,首先需要下载comm.jar以及和其相应的win32com.dll和m.properties这两个文件,由于sun已经停止了对comm的更新和维护,因此sun官网已经下载不到,不过可以上网去找!
得到这三个文件之后,网络上有很多种关于comm.jar安装的方法说明,可是我试过很多都没用!
导致后来修改太多自己都乱了,只有重装jdk来试!
最后的结果是这样:
在确定哪个jre情况下把win32com.dll放在jdk1.6.0_03/bin/的目录下,(我的jre是jdk目录下的)把comm.jar和m.properties放在jdk1.6.0_03\jre\lib\ext目录下注意是ext目录下,这也是我一直出错问题所在,网络上总是叫人放在jdk1.6.0_03\jre\lib\目录下!
这样就可以了我的CLASSPATH=.;D:
\ProgramFiles\Java\jdk1.6.0_03\bin然后PATH增加了D:
\ProgramFiles\Java\jdk1.6.0_03\bin这项,重启命令行,就可以了!
3.配置RXTXcomm.jar,一样需要下载comm.jar和其相关的rxtxSerial.dll这这个文件,一样的是rxtxSerial.dll放在jdk1.6.0_03/bin/的目录下,RXTXcomm.jarjdk1.6.0_03\jre\lib\ext目录下注意是ext目录下。
最终问题得以解决,终于可以读写串口了!
WINDOWS环境下JAVA串口RXTX编程DEMO
2010-08-1116:
44
m在windows下的开发维护已经停止了,rxtx的旧版本支持在m-win32-2.0基础上的扩展,rxtx新版本支持对m的覆盖式支持,也就是说原来用m的把所有importm.*改成importgnu.io.*就可以正常使用了,其他只须相关的dll文件,不用properties文件,支持的端口类型也明显多了很多
下载地址:
ftp:
//ftp.qbang.org/pub/rxtx/rxtx-2.1-7-bins-r2.zip
里面的然后配置环境
copyrxtxSerial.dllintoyourc:
\programfiles\java\jre-version\bindir
copyRXTXcomm.jarintoyourc:
\programfiles\java\jre-version\lib\extdir
把下载包中Windows\i368-mingw32\rxtxSerial.dll放到你%java_home%\jre\bin下面
把下载包中RXTXcomm.jar放到%java_home%\jre\lib\ext下面
OK,可以写程序了
/**
*
*/
packagecn.zhongxiaogang.test;
importjava.io.*;
importjava.util.*;
importgnu.io.*;
publicclassSimpleReadimplementsSerialPortEventListener{//SerialPortEventListener监听器,我的理解是独立开辟一个线程监听串口数据
staticCommPortIdentifierportId;//串口通信管理类
staticEnumerationportList; //已经连接上的端口的枚举
InputStreaminputStream;//从串口来的输入流
OutputStreamoutputStream;//向串口输出的流
SerialPortserialPort; //串口的引用
publicSimpleRead(){
try{
serialPort=(SerialPort)portId.open("myApp",2000);//打开串口名字为myapp,延迟为2毫秒
}catch(PortInUseExceptione){
}
try{
inputStream=serialPort.getInputStream();
outputStream=serialPort.getOutputStream();
}catch(IOExceptione){
}
try{
serialPort.addEventListener(this); //给当前串口天加一个监听器
}catch(TooManyListenersExceptione){
}
serialPort.notifyOnDataAvailable(true);//当有数据时通知
try{
serialPort.setSerialPortParams(2400,SerialPort.DATABITS_8, //设置串口读写参数
SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
}catch(UnsupportedCommOperationExceptione){
}
}
publicvoidserialEvent(SerialPortEventevent){//SerialPortEventListener的方法,监听的时候会不断执行
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);
}
outputStream.write("xiaogang".getBytes());
System.out.println(newString(readBuffer));
}catch(IOExceptione){
}
break;
}
}
publicstaticvoidmain(String[]args){
try{
portList=CommPortIdentifier.getPortIdentifiers();//得到当前连接上的端口
while(portList.hasMoreElements()){
portId=(CommPortIdentifier)portList.nextElement();
if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL){//判断如果端口类型是串口
if(portId.getName().equals("COM3")){//判断如果COM3端口已经启动就连接
SimpleReadreader=newSimpleRead();//实例一个
}
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
程序调试成功,不过还有很多问题,比如有乱码,还有程序不面向对象,etc.
java串口编程(短信modem)
2010-03-0209:
04
关键字:
java串口编程,短信modem,at指令
最终目标:
在Linux下提供一个稳定可靠的Java短信发送服务器。
第一阶段:
在Win32平台下编码并测试;
第二阶段:
在Linux平台下部署并测试;
目录:
相关资源:
(JavaCommunication包)
Win32串口编程前期准备
Win32短信Modem的测试步骤和AT指令:
Linux串口编程前期准备
列出系统所有串口、并口,来找到短信Modem所使用的串口名字
测试串口速率
Win32/Linux下串口编程的差异
Win32/Linux下串口编程(屏蔽平台差异)
Win32/Linux下加载Java串口驱动
-------------------------
相关资源:
(JavaCommunication包)
comm3.0_u1_linux.zip
comm2.0.3.zip(forsolaris)
javacomm20-win32.ziphttp:
//mdubuc.freeshell.org/Jolt/javacomm20-win32.zip
rxtx-2.1-7-bins.zip支持Windows/MacOS/Solaris/Linux四个平台
注:
在java中,利用JavaCommunication包可以操作串口,但官方的包在3.0之后就支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,不过在XP下还能使用,google一下就可以下载到。
当然,也可以用开源的Rxtx实现串口通信
Win32串口编程前期准备
1,unzipjavacomm20-win32.zip到c:
\下
2,copyc:
\commapi\win32com.dllc:
\jdk1.4.2\bin
3,copyc:
\commapi\m.propertiesc:
\jdk1.1.6\lib
4,copyc:
\commapi\comm.jarc:
\jdk1.1.6\lib
5,setCLASSPATH=c:
\jdk1.1.6\lib\comm.jar;%classpath%
6,如果使用USB口的GSM-Modem,则还需要安装,USB-to-Serial的驱动:
(经纬星航)
Win32短信Modem的测试步骤和AT指令:
1,安装USB驱动:
(经纬星航USB接口GSM/GPRSMODEM驱动程序)
2,打开设备管理器,看看是使用了哪个COM口(显示USB-to-Serial的为COM15),右键选择属性,查看速率为115200
3,使用Windows的超级终端,连接COM15,设定速率115200,其他缺省;
4,以TEXT模式测试发送短信
Java代码:
at
at+cmgf=1
at+cmgs=138xxxxxxxx
test
Linux串口编程前期准备
1,unzipcomm3.0_u1_linux.zip到/home/appusr/JavaComm下
2,cp/home/appusr/JavaComm/libLinuxSerialParallel.so/usr/lib
3,cp/home/appusr/JavaComm/m.properties/usr/java/j2sdk1.4.2_11/lib
4,cp/home/appusr/JavaComm/comm_linux.jar/usr/java/j2sdk1.4.2_11/lib
5,setCLASSPATH=.:
/home/appusr/JavaComm/comm_linux.jar:
$CLASSPATH
6,exportLANG=zh_CN.GBK#设置中文,否则针对短信进行UCS2编码不正确。
注1:
如果没有ROOT权限,可以直接执行如下命令:
Java代码:
exportLD_LIBRARY_PATH=/home/appusr/JavaComm:
$LD_LIBRARY_PATH
exportCLASSPATH=.:
javacomm_linux.jar:
commons-logging-1.0.4.jar:
log4j-1.2.8.jar:
junit-3.8.1.jar:
mpsp_bs2.jar
exportLANG=zh_CN.GBK
注2:
针对m.properties的搜索顺序如下:
Java代码:
1.Currentdirectory.
2.Eachdirectoryin${java.classpath} (ie.$CLASSPATHor-classpathsetting).
3./lib.
4./jre/lib
列出系统所有串口、并口,来找到短信Modem所使用的串口名字
Java代码:
publicstaticvoidshowCommPorts(){
CommPortIdentifierportID=null;
Listport1Vector=newVector(32);
Listport2Vector=newVector(32);
Enumerationports=CommPortIdentifier.getPortIdentifiers();
while(ports.hasMoreElements()){
portID=(CommPortIdentifier)ports.nextElement();
//debug("CommPort:
"+portID.getName()+"/type:
"+portID.getPortType());
switch(portID.getPortType()){
caseCommPortIdentifier.PORT_SERIAL:
port1Vector.add(portID.getName());break;
caseCommPortIdentifier.PORT_PARALLEL:
port2Vector.add(portID.getName());break;
default:
break;
}
}
debug("PORT_SERIAL ="+port1Vector);
debug("PORT_PARALLEL="+port2Vector);
}
串口编程速率测试:
使用AT指令测试串口速率,高速不一定兼容低速(发送命令,返回OK则表示握手成功)
Java代码:
publicstaticvoidtest_rates()throwsException{
int[]rates={2400,4800,9600,19200,115200,230400,460800,921600,};
Com2Smscomm=newCom2Sms();
comm.set_comm_rate(9600);
m_open(5000);
for(inti=0;i try{
comm.set_comm_rate(rates[i]);
comm.at_hello();
log.info("SUCCforrate:
"+rates[i]);
}catch(Exceptione){
log.warn("FAILforrate:
"+rates[i]);
}
sleepMSec(1000,"set_comm_rate:
"+rates[i]);
}
m_close(5000);
}
Win32/Linux下串口编程的差异
1,加载的驱动名字不同(m.Win32Driver|m.LinuxDriver)
2,Win32需要单独加载动态库:
System.loadLibrary("win32com")
3,所使用的串口名字不同(COM15|/de