java串口编程java串口通信监听者模式解析.docx

上传人:b****3 文档编号:26783035 上传时间:2023-06-22 格式:DOCX 页数:10 大小:20.95KB
下载 相关 举报
java串口编程java串口通信监听者模式解析.docx_第1页
第1页 / 共10页
java串口编程java串口通信监听者模式解析.docx_第2页
第2页 / 共10页
java串口编程java串口通信监听者模式解析.docx_第3页
第3页 / 共10页
java串口编程java串口通信监听者模式解析.docx_第4页
第4页 / 共10页
java串口编程java串口通信监听者模式解析.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

java串口编程java串口通信监听者模式解析.docx

《java串口编程java串口通信监听者模式解析.docx》由会员分享,可在线阅读,更多相关《java串口编程java串口通信监听者模式解析.docx(10页珍藏版)》请在冰豆网上搜索。

java串口编程java串口通信监听者模式解析.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1