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);
如果返回的是-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小时内删除。