《java串口编程,java串口通信,监听者模式解析.docx》由会员分享,可在线阅读,更多相关《java串口编程,java串口通信,监听者模式解析.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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
17、Buffer); outputStream.write(xiaogang.getBytes(); System.out.println(new String(readBuffer); catch (IOException e) break; public static void main(String args) try portList = CommPortIdentifier.getPortIdentifiers(); /得到当前连接上的端口 while (portList.hasMoreElements() portId = (CommPortIdentifier) portList.n
18、extElement(); if (portId.getPortType() = CommPortIdentifier.PORT_SERIAL) /判断如果端口类型是串口 if (portId.getName().equals(COM3) /判断如果COM3端口已经启动就连接 SimpleRead reader = new SimpleRead(); /实例一个 catch (Exception e) e.printStackTrace(); 程序调试成功,不过还有很多问题,比如有乱码,还有程序不面向对象,etc.java串口编程(短信modem)2010-03-02 09:04关键字: ja
19、va串口编程, 短信modem, at指令 最终目标:在Linux下提供一个稳定可靠的Java短信发送服务器。 第一阶段:在Win32平台下编码并测试; 第二阶段:在Linux平台下部署并测试; 目录: 相关资源:(Java Communication包) Win32串口编程前期准备 Win32短信Modem的测试步骤和AT指令: Linux串口编程前期准备 列出系统所有串口、并口,来找到短信Modem所使用的串口名字 测试串口速率 Win32/Linux下串口编程的差异 Win32/Linux下串口编程(屏蔽平台差异) Win32/Linux下加载Java串口驱动 - 相关资源:(Java
20、Communication包) comm3.0_u1_linux.zip comm2.0.3.zip (for solaris) javacomm20-win32.zip http:/mdubuc.freeshell.org/Jolt/javacomm20-win32.zip rxtx-2.1-7-bins.zip 支持Windows/MacOS/Solaris/Linux四个平台 注:在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后就支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,不过在XP下还能使用,goo
21、gle一下就可以下载到。当然,也可以用开源的Rxtx实现串口通信 Win32串口编程前期准备 1,unzip javacomm20-win32.zip 到c:下 2,copy c:commapiwin32com.dll c:jdk1.4.2bin 3,copy c:commapim.properties c:jdk1.1.6lib 4,copy c:commapicomm.jar c:jdk1.1.6lib 5,set CLASSPATH=c:jdk1.1.6libcomm.jar;%classpath% 6,如果使用USB口的GSM-Modem,则还需要安装,USB-to-Serial的驱动
22、: (经纬星航) Win32短信Modem的测试步骤和AT指令: 1,安装USB驱动:( 经纬星航 USB接口 GSM/GPRS MODEM驱动程序 ) 2,打开设备管理器,看看是使用了哪个COM口(显示USB-to-Serial的为COM15),右键选择属性,查看速率为115200 3,使用Windows的超级终端,连接COM15,设定速率115200,其他缺省; 4,以TEXT模式测试发送短信 Java代码:atat+cmgf=1at+cmgs=138xxxxxxxxtest Linux串口编程前期准备 1,unzip comm3.0_u1_linux.zip 到/home/appusr/
23、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,set CLASSPATH=.:/home/appusr/JavaComm/comm_linux.jar:$CLASSPATH 6,export LANG=zh_CN.GBK
24、#设置中文,否则针对短信进行UCS2编码不正确。 注1:如果没有ROOT权限,可以直接执行如下命令:Java代码:export LD_LIBRARY_PATH=/home/appusr/JavaComm:$LD_LIBRARY_PATH export CLASSPATH=.:javacomm_linux.jar:commons-logging-1.0.4.jar:log4j-1.2.8.jar:junit-3.8.1.jar:mpsp_bs2.jarexport LANG=zh_CN.GBK 注2:针对m.properties的搜索顺序如下:Java代码:1. Current director
25、y. 2. Each directory in $java.classpath (ie. $CLASSPATH or -classpath setting).3. /lib. 4. /jre/lib列出系统所有串口、并口,来找到短信Modem所使用的串口名字 Java代码:public static void showCommPorts() CommPortIdentifier portID = null; List port1Vector = new Vector(32); List port2Vector = new Vector(32); Enumeration ports = Comm
26、PortIdentifier.getPortIdentifiers(); while (ports.hasMoreElements() portID = (CommPortIdentifier)ports.nextElement(); /debug(CommPort : +portID.getName()+/type:+portID.getPortType(); switch(portID.getPortType() case CommPortIdentifier.PORT_SERIAL : port1Vector.add(portID.getName(); break; case CommP
27、ortIdentifier.PORT_PARALLEL: port2Vector.add(portID.getName(); break; default: break; debug(PORT_SERIAL = +port1Vector); debug(PORT_PARALLEL = +port2Vector);串口编程速率测试:使用AT指令测试串口速率,高速不一定兼容低速(发送命令,返回OK则表示握手成功) Java代码:public static void test_rates() throws Exception int rates = 2400, 4800, 9600, 19200,
28、115200, 230400, 460800, 921600, ; Com2Sms comm = new Com2Sms(); comm.set_comm_rate(9600); m_open(5000); for(int i=0; irates.length; i+) try comm.set_comm_rate(ratesi); comm.at_hello(); log.info(SUCC for rate:+ratesi); catch(Exception e) log.warn(FAIL for rate:+ratesi); sleepMSec(1000, set_comm_rate:
29、+ratesi); m_close(5000);Win32/Linux下串口编程的差异 1,加载的驱动名字不同(m.Win32Driver | m.LinuxDriver) 2,Win32需要单独加载动态库:System.loadLibrary(win32com) 3,所使用的串口名字不同(COM15 | /dev/ttyS0),后者可能还需要root权限。 4,速率可能不一样; Win32/Linux下串口编程(屏蔽平台差异) Java代码:Com2Sms comm = new Com2Sms(); /调用initDriver初始化comm.set_comm(COM16, 115200);
30、/win32/comm.set_comm(/dev/ttyS0, 9600); /linuxWin32/Linux下加载Java串口驱动Java代码:public static boolean initDriver() boolean b = initDriver_linux(); if (!b) initDriver_win32();/ if (!b) initDriver_solaris(); return b;protected static boolean initDriver_win32() try System.loadLibrary(win32com); debug(loadLi
31、brary().win32com.dll); String driverName = m.Win32Driver; CommDriver driver = (CommDriver) Class.forName(driverName).newInstance(); driver.initialize(); debug(initDriver().+driverName); return true; catch (Throwable e) / e.printStackTrace(); log.warn(initDriver() +e); return false; protected static
32、boolean initDriver_linux() try String driverName = m.LinuxDriver; CommDriver driver = (CommDriver) Class.forName(driverName).newInstance(); driver.initialize(); debug(initDriver().+driverName); return true; catch (Throwable e) / e.printStackTrace(); log.warn(initDriver() +e); return false; 下一步工作(20070813): 1,定义独立的服务器,提供http对外接口。(已完成) 2,提供任务队列处理,控制发送流量。(已完成) 3,对WapPush的支持。(已完成) 4,对OMADRM中DRC的支持。(和3一样); 5,测试3和4的超长短信(完成) 6,测试普通文本的超长短信(未完)。