java串口编程,java串口通信,监听者模式解析.docx
《java串口编程,java串口通信,监听者模式解析.docx》由会员分享,可在线阅读,更多相关《java串口编程,java串口通信,监听者模式解析.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、java调用coms端口串口通信的方法。首先需要下到串口驱动。javacomm20-win32.zip去sun的主页应该有下的。在这个驱动中有comm.jar,m.properties,win32com.dll这么3个重要的文件。1、首先配置驱动,把m.properties,win32com.dll拷贝到你的jdk中具体位置为C:Program FilesJavajdk1.6.0_06bin然后配置windows系统环境变量,在path中加入C:Program FilesJavajdk1.6.0_06bin;打开你的java工程,配置user library,并导入comm.jar包。2、现在
2、就可以开始写代码了。串口读写代码如下CommPortIdentifier portID = CommPortIdentifier.getPortIdentifier(com);/1,先拿到Identifier/其中com是String类型的,传入的是串口名com=COM1;SerialPort port = (SerialPort)portID.open(MyComm, 100000000);/2,打开串口/MyComm是串口名,100000000是串口过期时间(ms)。port.setSerialPortParams(rate, databits,stopbit, parity);/3,设置
3、串口属性/rate 波特率(默认9600),databits载波位(默认8),stopbit停止位(默认1),parity校验位(默认0无校验)port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);/4(可选)设置数据流控制模式,默认为无port.close();/关闭串口3、串口读入写出流。OutputStream os=port.getOutputStream();/拿到写出流。写出流就随便写就行。port.getOutputStream().flush();/写完要记得做一次冲一下缓冲区InputStream is= port.getI
4、nputStream();/拿到读入流。is.read();/每次读入一个int,这个是个阻塞函数,在无数据的时候会中断。4、串口读入轮询模式一种读取的方式是每次做 byte b=new byte1024; is.read(b);如果返回的是-1表示无数据。可以中断几毫秒然后再去读。比较低效的一种读取模式,但是在使用阻塞函数的时候还是很好用的。5、串口的监听模式/5.1首先建立监听类public class CommListener implements SerialPortEventListener /继承自m.SerialPortEventListener;/实现监听方法public vo
5、id serialEvent(SerialPortEvent arg0)当有新数据进入的时候会被调用,传入m.SerialPortEvent对象参数。if (arg0.getEventType()=SerialPortEvent.DATA_AVAILABLE)/如果是有效数据的话就做read /read();/5.2建立好监听类以后要在port上添加。port.addEventListener(commListener); /其中port是上文打开的串口端口,commListener是上文的监听器实例port.notifyOnDataAvailable(true);/设置监听模式为当有数据到达
6、时唤醒监听线程。/千万注意一定要有这句代码,其他很多博文都没有介绍这个。没这句话就不会唤醒监听线程了。java操作com串口配置的一些问题2010-08-11 17:24从来没想过用java来操作底层!昨天接到一个小项目!从底层的串口读取数据,然后用web页面显示出来!很明显用C可以很好的处理底层的交互!可是对于web习惯也熟悉了jsp,所以想用java来处理串口! Google一下java和串口,可以找到很多关于java处理串口的文章,其中离不开两个技术一个是用sun提供的comm.jar,一个是RXTX提供的RXTXcomm.jar,其中后者是对前者完全的覆盖!不过麻烦的是这两个都需要安装
7、,我的问题就是出在这里!配置了一个晚上不仅一团糟,而且还没办法运行,现在把几个可能遇到的问题总结下: 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,一个CL
8、SASSPATH,这两个的设置就关系到底是哪个jre在作用,还有一个比较土的办法是修改其中一个jre名字,然后看是哪个使得java程序运行不正常即可!要搞清楚jre原因是因为comm.jar的程序运行需要在jre增加一些文件。 2.配置comm.jar环境,首先需要下载comm.jar以及和其相应的win32com.dll和m.properties这两个文件,由于sun已经停止了对comm的更新和维护,因此sun官网已经下载不到,不过可以上网去找!得到这三个文件之后,网络上有很多种关于comm.jar安装的方法说明,可是我试过很多都没用!导致后来修改太多自己都乱了,只有重装jdk来试!最后的结
9、果是这样:在确定哪个jre情况下把win32com.dll放在jdk1.6.0_03/bin/的目录下,(我的jre是jdk目录下的)把comm.jar和m.properties放在jdk1.6.0_03jrelibext目录下注意是ext目录下,这也是我一直出错问题所在,网络上总是叫人放在jdk1.6.0_03jrelib目录下!这样就可以了我的CLASSPATH=.;D:Program FilesJavajdk1.6.0_03bin然后PATH 增加了D:Program FilesJavajdk1.6.0_03bin这项,重启命令行,就可以了! 3.配置RXTXcomm.jar,一样需要下
10、载comm.jar和其相关的rxtxSerial.dll这这个文件,一样的是rxtxSerial.dll放在jdk1.6.0_03/bin/的目录下,RXTXcomm.jarjdk1.6.0_03jrelibext目录下注意是ext目录下。 最终问题得以解决,终于可以读写串口了!WINDOWS环境下JAVA串口RXTX编程DEMO2010-08-11 16:44m在windows下的开发维护已经停止了,rxtx的旧版本支持在m-win32-2.0基础上的扩展,rxtx新版本支持对m的覆盖式支持,也就是说原来用m的把所有import m.*改成import gnu.io.*就可以正常使用了,其他
11、只须相关的dll文件,不用properties文件,支持的端口类型也明显多了很多下载地址:ftp:/ftp.qbang.org/pub/rxtx/rxtx-2.1-7-bins-r2.zip里面的然后配置环境 copy rxtxSerial.dll into your c:program filesjavajre-versionbin dir copy RXTXcomm.jar into your c:program filesjavajre-versionlibext dir 把下载包中Windowsi368-mingw32rxtxSerial.dll 放到你%java_home%jrebi
12、n下面把下载包中RXTXcomm.jar放到%java_home%jrelibext下面OK,可以写程序了/* */package cn.zhongxiaogang.test;import java.io.*;import java.util.*;import gnu.io.*;public class SimpleRead implements SerialPortEventListener /SerialPortEventListener 监听器,我的理解是独立开辟一个线程监听串口数据static CommPortIdentifier portId; /串口通信管理类static Enum
13、eration portList; /已经连接上的端口的枚举InputStream inputStream; /从串口来的输入流OutputStream outputStream;/向串口输出的流SerialPort serialPort; /串口的引用public SimpleRead() try serialPort = (SerialPort) portId.open(myApp, 2000);/打开串口名字为myapp,延迟为2毫秒 catch (PortInUseException e) try inputStream = serialPort.getInputStream(); o
14、utputStream = serialPort.getOutputStream(); catch (IOException e) try serialPort.addEventListener(this); /给当前串口天加一个监听器 catch (TooManyListenersException e) serialPort.notifyOnDataAvailable(true); /当有数据时通知 try serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8, /设置串口读写参数 SerialPort.STOPBITS_1,
15、 SerialPort.PARITY_NONE); catch (UnsupportedCommOperationException e) public void serialEvent(SerialPortEvent event) /SerialPortEventListener 的方法,监听的时候会不断执行 switch (event.getEventType() case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPor
16、tEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE:/当有可用数据时读取数据,并且给串口返回数据 byte readBuffer = new byte20; try while (inputStream.available() 0) int numBytes = inputStream.read(read
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 串口 编程 通信 监听 模式 解析
限制150内