java串口通信小例子

刚来公司实习,还什么都不会,也是第一次接触串口,短信cat之类的东西。然后写了个小程序。
开始前需要下载javacomm20-win32 .zip,下载解压,然后开始配置,这个我也是头晕,不过用了个本方法,下面的配置可以参考:
1.win32com.dll  放在  C:\Program Files\Java\jdk1.6.0_21\jre\bin目录下;
2.javax.comm.porperties 放在  C:\Program Files\Java\jdk1.6.0_21\jre\lib目录下;
 配置完之后,在java中可以引入相应的javax.comm包即可。
下面开始就是串口通信的的简单小例子了,采用的是AT命令。

package PortDemo;

import java.io.OutputStream;
import java.util.Map;

import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;

public class FinalPort {


public static void monSms(Map a){
SerialPort port = null;
OutputStream out = null;
java.io.InputStream inn = null;
String portName = (String) a.get("portName");
String ownerName = (String) a.get("ownerName");
int lazyLoadTime = (Integer) a.get("lazyLoadTime");
String smsNumber = (String) a.get("smsNumber");
String[] descNumbers = (String[]) a.get("descNumbers");
String smsText = (String) a.get("smsText");
int baudrate = (Integer) a.get("baudrate");
int databits = (Integer) a.get("databits");
int stopbits = (Integer) a.get("stopbits");
int parity = (Integer) a.get("parity");
try {
String[] texts = sendSms(smsNumber,descNumbers, smsText);
for(int i=0;i<texts.length;i++){
port = openPort(portName, ownerName, lazyLoadTime,baudrate, databits, stopbits,parity);
out = port.getOutputStream();
inn=port.getInputStream();
String text = texts[i];
Thread.sleep(300);
int num = (text.length() - 18) / 2;                  
char ch = '\r';
byte[] bytes = ("AT+CMGF=0" + ch).getBytes();
out.write(bytes);
Thread.sleep(300);
byte[] data = new byte[30];//读取信息接收数组
StringBuffer sb = new StringBuffer();   //设置读取信息的缓冲区

int red=inn.read(data);                      //读取信息到data数组,返回信息的长度
for(int j=0;j<data.length;j++){
sb.append((char)data[j]); 
}
if(sb.indexOf("OK")>=0){
sb.delete(0, sb.length()-1); //清空读取信息的缓冲区
out.write(("AT+CMGS=" + num + ch).getBytes());
Thread.sleep(300);
byte[] data2 = new byte[20];
inn.read(data2); //读取信息到data2数组
for(int j=0;j<data2.length;j++){
sb.append((char)data2[j]); //将读取到的信息转换成字符串
}
}
if(sb.indexOf(">") >= 0){
sb.delete(0, sb.length()-1); //清空读取信息的缓冲区
String c = "\u001a";
text = text + c;
System.out.println("text:"+text);
out.write(text.getBytes()); //发送信息
Thread.sleep(2000);
}
inn.close();
out.close();
port.close();
}
}catch(Exception e){}
}


private static String[] sendSms(String Smsc_Number,String[] Dest_Numbers,String Sms_Text) {
int size = Dest_Numbers.length;
String[] strs = new String[size];
for(int i=0;i<size;i++){
String Dest_Number = Dest_Numbers[i];
String str = "";
        str = str + "089168";
        char[] chArray = (Smsc_Number + "F").toCharArray();
        for (int j = 0; j < chArray.length; j += 2)
        {
            str = str + String.valueOf(chArray[j + 1]) + String.valueOf(chArray[j]);
        }
        str = str + "11000D9168";
        char[] chArray2 = (Dest_Number + "F").toCharArray();
        for (int j = 0; j < chArray2.length; j += 2){
        
            str = str + String.valueOf(chArray2[j + 1]) + String.valueOf(chArray2[j]);
        }
        str = str + "000800";
        str = str + gbEncoding(Sms_Text);
        strs[i] = str;
}
return strs;
}

public static SerialPort openPort(String portName,String ownerName,int lazyLoadTime,int baudrate,int databits,
int stopbits,int parity) throws PortInUseException,NoSuchPortException, 
UnsupportedCommOperationException {
SerialPort port = (SerialPort) CommPortIdentifier.getPortIdentifier(portName).open(ownerName,lazyLoadTime);
port.setSerialPortParams(baudrate,databits, stopbits,parity);
return port;
}

public static String gbEncoding(String gbString) {  
        char[] utfBytes = gbString.toCharArray();  
        String unicodeBytes = Integer.toHexString((utfBytes.length)*2);
        if(unicodeBytes.length() < 2){
        unicodeBytes = "0"+unicodeBytes;
        }
        for (int byteIndex = 0; byteIndex < utfBytes.length; byteIndex++) {  
            String hexB = Integer.toHexString(utfBytes[byteIndex]);  
            if (hexB.length() <= 2) {  
                hexB = "00" + hexB;  
            }  
            unicodeBytes = unicodeBytes + hexB;  
        }  
        return unicodeBytes.toUpperCase();  
    }  
}

 
接下来给测试一下能否发短信了:

package PortDemo;

import java.util.HashMap;
import java.util.Map;

public class Test {
public static void main(String[] args){
String[] bytes = {"18032213010","15016522101"};
String portName = "COM2";
String ownerName = "myddd";
int lazyLoadTime = 2000;
String smsNumber = "13800100500";
String smsText = "您好,您该交话费啦";
int baudrate = 9600;
int databits = 8;
int stopbits = 1;
int parity = 0;

Map a = new HashMap();
a.put("portName", portName);
a.put("ownerName", ownerName);
a.put("lazyLoadTime", lazyLoadTime);
a.put("smsNumber", smsNumber);
a.put("descNumbers", bytes);
a.put("smsText", smsText);
a.put("baudrate", baudrate);
a.put("databits", databits);
a.put("stopbits", stopbits);
a.put("parity", parity);

FinalPort.monSms(a);
}
}

 

这个在我的机器上正常运行:XP系统,jdk1.6.

需要注意的是,如果出现javax.comm.NoSucnPortException错误,说明配置文件放错位置了,这时候请查看你的ide使用的是jre还是jdk里面的jre。我用的事myeclipse,设置的IDE默认的jre是C:\Program Files (x86)\Java\jdk1.6.0_51

 ,它使用的是jdk1.6.0_51里面的jre,所以我把comm32包的配置文件放在里jdk里面的jre中的bin和lib目录了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值