java编写简单的串口程序访问短信猫

鉴客 发布于 2011/09/08 11:33
阅读 5K+
收藏 3

java编写串口程序,需要java的comm包,在:

http://java.sun.com/products/javacomm/

当前最新版本是3.0update1。这个版本只支持linux和solaris,2.0.3版本是只支持windows。

为了能用一套api跑多个平台,选择了RxTx,一个第三方的免费API,支持各个主要平台。但是也有缺点,rxtx分发的动态链接库不支持64位系统。就先用它吧。

网站在:

http://rxtx.qbang.org/wiki

这个网站不是很稳定,昨天怎么也上不去,还以为被墙了呢。

下载它的最新版本。以下是在windows xp下使用的情况。复制rxtxSerial.dll文件到jre/bin目录下。如果是安装了JDK,建议jdk的bin目录下和jre的bin目录下 各放置一份,省心。因为如果用eclipse开发的话,默认不使用jdk,是使用jre的。另外一个RXTXcomm.jar包,就直接引到项目里面就可 以了,建议不要按照官方的做法,复制到jre/lib或者jre/lib/ext目录下,会引起eclipse警告或者报错的。

如果使用maven,也可以:

<dependency>
    <groupId>org.rxtx</groupId>
    <artifactId>rxtx</artifactId>
    <version>2.1.7</version>
</dependency>

代码本身很简单:

import gnu.io.CommPortIdentifier;

import gnu.io.PortInUseException;
 
import gnu.io.SerialPort;
 
import gnu.io.UnsupportedCommOperationException; 

import java.io.IOException;

import java.io.InputStream;
 
import java.io.OutputStream;
 
import java.util.Enumeration;
 
import java.util.TooManyListenersException; 

public class ComTest { 

    /**
     * @param args
 
     * @throws Exception
 
     */
 
    @SuppressWarnings("unchecked")
 
    public static void main(String[] args) throws Exception {
 
        String port = "COM5"; 

        for (Enumeration<CommPortIdentifier> e = CommPortIdentifier
                .getPortIdentifiers(); e.hasMoreElements();) {
 
            CommPortIdentifier portId = e.nextElement();
 
            if (portId.getName().equals(port)) {
 
                System.out.println("\r");
 
                System.out.println("找到端口: " + port);
 
                sendAtTest(portId);
 
            }
 
        }
 
    } 

    private static void sendAtTest(CommPortIdentifier portId)

            throws PortInUseException, UnsupportedCommOperationException,
 
            TooManyListenersException, IOException, InterruptedException {
 
        System.out.println("打开端口 …");
 
        final SerialPort serialPort = (SerialPort) portId.open("wavecom", 100);
 
        serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
 
        serialPort.setSerialPortParams(115200,// 波特率
 
                SerialPort.DATABITS_8,// 数据位数
 
                SerialPort.STOPBITS_1, // 停止位
 
                SerialPort.PARITY_NONE);// 奇偶位
 
        System.out.println("端口已打开。\n发送AT指令 …");
 
        InputStream inputStream=serialPort.getInputStream();
 
        OutputStream outputStream=serialPort.getOutputStream();
 
        outputStream.write("AT\r".getBytes());
 
        Thread.sleep(1000);
 
        byte[] data=new byte[1024];
 
        for(int i=inputStream.read(data);;i=inputStream.read(data)){
 
            if(i>0){
 
                System.out.println(new String(data,0,i));
 
                System.out.println("成功收到指令返回值。");
 
                break;
 
            }
 
        } 
        serialPort.close();
        System.out.println("关闭端口。");
 
    } 

}

这是一个简单的测试,以前也没用过AT指令集,慢慢边测试边使用。运行结果:

image

基本上,RxTx就是对java comm包的仿制,除了包名不一样,类和行为都是一样的。

打开串口以后,可以操作一个输入流,一个输出流,输入命令,输出结果。

上面实例很简单,使用了直接的方式接收命令,这样不适合复杂的应用。还有一种监听器的方式,稍后再做测试。

加载中
0
zhengyu008
zhengyu008
牛掰,不过想请教一下,使用RXTX也能访问使用以太网协议连接的PLC吗?
0
张云凯

你好,想问一下为什么我照着你的代码,获取到了串口但是在读写的时候却阻塞了

输出信息如下:

找到端口: COM5

打开端口 …
端口已打开。

发送AT指令 …

然后程序就卡在这里了,等了好久都没有反应,应该是读写操作出现阻塞了

请问这该怎么解决呢?


0
p
poplar89

你好,请教个问题,在使用rxtx调用串口的时候发生了这样一种情况:

inputstream的read(byte[] bytes)方法返回值为-1,而只要和楼主一样把线程sleep几秒就没有这个问题,这个是什么原因呢?

另外在socket编程中也发生了同样的情况。 

pseudo
pseudo
在java中用stream读取数据时,如果到达流的末尾会返回-1. 因为你用socket从网络上获取数据, socket是长连接的,也就是如果你不关闭它会一直处于连接状态, 虽然它已建立连接,但如果没有从远程取得数据它还是会返回-1.当有数据时到达时它才会继续读取.就像打电话一样, 虽然电话已经接通了,但对方不说话你是听不到任何声音的.只能当对方说话时你才能听见.
0
自由舰
现在都没人用短信猫了,都用网关短信了,稳定,速度快 硕达通短信平台,发验证码5秒到,发通知5秒到,速度快,到达率98%以上,成功计费(失败不计费)实时状态报告(成功失败一目了然)支持上下行 北京硕达通www.shdat.com 买短信有红包!
返回顶部
顶部