java调用coms端口串口通信的方法。
首先需要下到串口驱动。javacomm20-win32.zip
去sun的主页应该有下的。
在这个驱动中有comm.jar,javaxm.properties,win32com.dll
这么3个重要的文件。
1、首先配置驱动,把javaxm.properties,win32com.dll拷贝到你的jdk中
具体位置为C:\Program Files\Java\jdk1.6.0_06\bin
然后配置windows系统环境变量,在path中加入C:\Program Files\Java\jdk1.6.0_06\bin;
打开你的java工程,配置user library,并导入comm.jar包。
2、现在就可以开始写代码了。串口读写代码如下
CommPortIdentifier portID = PortIdentifier(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,设置串口属性
//rate 波特率(默认9600),databits载波位(默认8),stopbit停止位(默认1),parity校验位(默认0无校验)
port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);//4(可选)设置数据流控制模式,默认为无
port.close();//关闭串口
3、串口读入写出流。
OutputStream OutputStream();//拿到写出流。写出流就随便写就行。
OutputStream().flush();//写完要记得做一次冲一下缓冲区
InputStream is= InputStream();//拿到读入流。
is.read();//每次读入一个int,这个是个阻塞函数,在无数据的时候会中断。
4、串口读入轮询模式
一种读取的方式是每次做
byte b[]=new byte[1024];
is.read(b);
is.read(b);
如果返回的是-1表示无数据。可以中断几毫秒然后再去读。
比较低效的一种读取模式,但是在使用阻塞函数的时候还是很好用的。
5、串口的监听模式
//5.1首先建立监听类
public class CommListener implements SerialPortEventListener
//继承自javaxm.SerialPortEventListener;
//实现监听方法public void serialEvent(SerialPortEvent arg0){}
当有新数据进入的时候会被调用,传入javaxm.SerialPortEvent对象参数。
if (EventType()==SerialPortEvent.DATA_AVAILABLE)//如果是有效数据的话就做read
{
//read();
}
//5.2建立好监听类以后要在port上添加。
port.addEventListener(commListener);
//其中port是上文打开的串口端口,commListener是上文的实例
ifyOnDataAvailable(true);//设置监听模式为当有数据到达时唤醒监听线程。
//千万注意一定要有这句代码,其他很多博文都没有介绍这个。没这句话就不会唤醒监听线程了。
java操作com串口配置的一些问题
2010-08-11 17: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和javaxm.properties这两个文件,由于sun已经停止了对comm的更新和维护,因此sun已经下载不到,不过可以上网去!得到这三个文件之后,网络上有很多种关于comm.jar安装的方法说明,可是我试过很多都没用!导致后来修改太多自己都乱了,只有重装jdk来试!最后的结果是这样:在确定哪个jre情况下把win32com.dll放在jdk1.6.0_03/bin/的目录下,(我的jre是jdk目录下的)把comm.jar和javaxm.properties放在jdk1.6.0_03\jre\lib\ext目录下注意是ext目录下,这也是我一直出错问题所在,网络上总是叫人放在jdk1.6.0_03\jre\lib\目录下!这样就可以了我的CLASSPATH=.;D:\Program Files\Java\jdk1.6.0_03\bin然后PATH 增加了D:\Program Files\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-11 16:44
javaxm在windows下的开发维护已经停止了,rxtx的旧版本支持在javaxm-win32-2.0基础上的扩展,rxtx新版本支持对javaxm的覆盖式支持,也就是说原来用javaxm的把所有import javaxm.*改成import gnu.io.*就可以正常使用了,其他只须相关的dll文件,不用properties文件,支持的端口类型也明显多了很多 下载地址:ftp:///pub/rxtx/rxtx-2.1-7-bins-r2.zip 里面的然后配置环境 copy rxtxSerial.dll into your c:\program files\java\jre-version\bin dir copy RXTXcomm.jar into your c:\program files\java\jre-version\lib\ext dir 把下载包中Windows\i368-mingw32\rxtxSerial.dll 放到你%java_home%\jre\bin下面 把下载包中RXTXcomm.jar放到%java_home%\jre\lib\ext下面 OK,可以写程序了 /** * */ package st; import java.io.*; import java.util.*; import gnu.io.*; public class SimpleRead implements SerialPortEventListener { //SerialPortEventListener ,我的理解是独立开辟一个线程监听串口数据 static CommPortIdentifier portId; //串口通信管理类jdk下载具体步骤 static Enumeration portList; //已经连接上的端口的枚举 InputStream inputStream; //从串口来的输入流 OutputStream outputStream;//向串口输出的流 SerialPort serialPort; //串口的引用 public SimpleRead() { try { serialPort = (SerialPort) portId.open("myApp", 2000);//打开串口名字为myapp,延迟为2毫秒 } catch (PortInUseException e) { } try { inputStream = InputStream(); outputStream = OutputStream(); } catch (IOException e) { } try { serialPort.addEventListener(this); //给当前串口天加一个 } catch (TooManyListenersException e) { } ifyOnDataAvailable(true); //当有数据时通知 try { serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8, //设置串口读写参数 SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { } } public void serialEvent(SerialPortEvent event) {//SerialPortEventListener 的方法,监听的时候会不断执行 switch (EventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE://当有可用数据时读取数据,并且给串口返回数据 byte[] readBuffer = new byte[20]; try { while (inputStream.available() > 0) { int numBytes = ad(readBuffer); } outputStream.write("xiaogang".getBytes()); System.out.println(new String(readBuffer)); } catch (IOException e) { } break; } } public static void main(String[] args) { try { portList = PortIdentifiers(); //得到当前连接上的端口 while (portList.hasMoreElements()) { portId = (CommPortIdentifier) Element(); if (PortType() == CommPortIdentifier.PORT_SERIAL) {//判断如果端口类型是串口 if (Name().equals("COM3")) { //判断如果COM3端口已经启动就连接 SimpleRead reader = new SimpleRead(); //实例一个 } } } } catch (Exception e) { e.printStackTrace(); } } } 程序调试成功,不过还有很多问题,比如有乱码,还有程序不面向对象,etc. |
java串口编程(短信modem)
2010-03-02 09:04
关键字: java串口编程, 短信modem, at指令 最终目标:在Linux下提供一个稳定可靠的Java短信发送服务器。 第一阶段:在Win32平台下编码并测试; 第二阶段:在Linux平台下部署并测试; 目录: 相关资源:(Java Communication包) Win32串口编程前期准备 Win32短信Modem的测试步骤和AT指令: Linux串口编程前期准备 列出系统所有串口、并口,来到短信Modem所使用的串口名字 测试串口速率 Win32/Linux下串口编程的差异 Win32/Linux下串口编程(屏蔽平台差异) Win32/Linux下加载Java串口驱动 ------------------------- 相关资源:(Java Communication包) comm3.0_u1_linux.zip www.sun/l?id=43208d3d comm2.0.3.zip (for solaris) javacomm20-win32.zip /Jolt/javacomm20-win32.zip rxtx-2.1-7-bins.zip www.frii/~jarvi/rxtx 支持Windows/MacOS/Solaris/Linux四个平台 注:在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后就支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,不过在XP下还能使用,google一下就可以下载到。当然,也可以用开源的Rxtx实现串口通信 Win32串口编程前期准备 1,unzip javacomm20-win32.zip 到c:\下 2,copy c:\commapi\win32com.dll c:\jdk1.4.2\bin 3,copy c:\commapi\javaxm.properties c:\jdk1.1.6\lib 4,copy c:\commapi\comm.jar c:\jdk1.1.6\lib 5,set CLASSPATH=c:\jdk1.1.6\lib\comm.jar;%classpath% 6,如果使用USB口的GSM-Modem,则还需要安装,USB-to-Serial的驱动:www.jingweigps/xzzx.htm (经纬星航) Win32短信Modem的测试步骤和AT指令: 1,安装USB驱动:(www.jingweigps/xzzx.htm 经纬星航 USB接口 GSM/GPRS MODEM驱动程序 ) 2,打开设备管理器,看看是使用了哪个COM口(显示USB-to-Serial的为COM15),右键选择属性,查看速率为115200 3,使用Windows的超级终端,连接COM15,设定速率115200,其他缺省; 4,以TEXT模式测试 Java代码: at at+cmgf=1 at+cmgs=138xxxxxxxx test <ctrl-z> Linux串口编程前期准备 1,unzip comm3.0_u1_linux.zip 到/home/appusr/JavaComm下 2,cp /home/appusr/JavaComm/libLinuxSerialParallel.so /usr/lib 3,cp /home/appusr/JavaComm/javaxm.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 #设置中文,否则针对短信进行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.jar export LANG=zh_CN.GBK 注2:针对javaxm.properties的搜索顺序如下: Java代码: 1. Current directory. 2. Each directory in ${java.classpath} (ie. $CLASSPATH or -classpath setting). 3. <JDK>/lib. 4. <JDK>/jre/lib 列出系统所有串口、并口,来到短信Modem所使用的串口名字 Java代码: public static void showCommPorts() { CommPortIdentifier portID = null; List port1Vector = new Vector(32); List port2Vector = new Vector(32); Enumeration ports = PortIdentifiers(); while (ports.hasMoreElements()) { portID = (Element(); //debug("CommPort : "+Name()+"/type:"+PortType()); PortType()) { case CommPortIdentifier.PORT_SERIAL : port1Vector.Name()); break; case CommPortIdentifier.PORT_PARALLEL: port2Vector.Name()); 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, 115200, 230400, 460800, 921600, }; Com2Sms comm = new Com2Sms(); comm.set_comm_rate(9600); commm_open(5000); for(int i=0; i<rates.length; i++) { try { comm.set_comm_rate(rates[i]); comm.at_hello(); log.info("SUCC for rate:"+rates[i]); }catch(Exception e) { log.warn("FAIL for rate:"+rates[i]); } sleepMSec(1000, "set_comm_rate:"+rates[i]); } commm_close(5000); } Win32/Linux下串口编程的差异 1,加载的驱动名字不同(com.sunm.Win32Driver | com.sunm.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); //win32 //comm.set_comm("/dev/ttyS0", 9600); //linux Win32/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("loadLibrary()...win32com.dll"); String driverName = "com.sunm.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 boolean initDriver_linux() { try { String driverName = "com.sunm.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,测试普通文本的超长短信(未完)。 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论