import javax.comm.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.*;
/**
* Created by WuSong
* 2017-05-04
*/
public class Dlt645Test implements SerialPortEventListener{
private ArrayList<String> portList;
private CommPortIdentifier portId;
private SerialPort serialPort;
private OutputStream outputStream;
private InputStream inputStream;
private int packetlength;
static final char[] HEX_CHAR_TABLE = {
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
};
public void scanPorts(){
portList = new ArrayList<String>();
Enumeration<?> en = CommPortIdentifier.getPortIdentifiers();
CommPortIdentifier portId;
while(en.hasMoreElements()){
portId = (CommPortIdentifier)en.nextElement();
if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){
String name = portId.getName();
if(!portList.contains(name)){
portList.add(name);
}
}
}
if(null == portList || portList.isEmpty()){
System.out.println("未找到可用的串行端口号,程序无法启动!");
}
}
public void openSerialPort(String portname){
try{
portId = CommPortIdentifier.getPortIdentifier(portname);
}catch (NoSuchPortException e){
System.out.println("抱歉,没有找到" + portname + "串行端口号!");
return;
}
}
public void setSerialPortParam(int rate,int data,int stop,int parity){
try{
serialPort = (SerialPort)portId.open("test",2000);
}catch (PortInUseException e){
System.out.println(serialPort.getName() +"端口已被占用");
return;
}
try {
serialPort.setSerialPortParams(rate,data,stop,parity);
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
}
try{
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();
}catch (IOException e){
e.printStackTrace();
}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
e.printStackTrace();
}
serialPort.notifyOnDataAvailable(true);
}
public void sendDataToSerialPort(byte[] b){
try {
outputStream.write(b);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public void serialEvent(SerialPortEvent e){
switch (e.getEventType()) {
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:
// String data = toHexString(getPack());
byte[] msgPack=this.getPack();
System.out.println("**********************************************************");
List list = new ArrayList();
for (int i = 0; i < msgPack.length; i++) {
//System.out.println(msgPack[i]<0?msgPack[i]+256:msgPack[i]);
list.add(Integer.toHexString(msgPack[i]<0?msgPack[i]+256:msgPack[i]));
/*for (int j = i; j <= i; j++) {
if ((list.get(j).toString()).length()==1){
((String) list.get(j)).replace((String)list.get(j),String.format("%02d",Integer.parseInt((String)list.get(j))));
}
}*/
}
Object[] msg=list.toArray(new String[list.size()]);
list=new ArrayList();
for (int i = 0; i < msg.length; i++) {
if (msg[i].toString().length()==1){
list.add(String.format("%02d",Integer.parseInt((String) msg[i])));
}else {
list.add(msg[i]);
}
}
System.out.println("返回数据:" + list.toString().replace(",","").replaceAll("\\[|\\]",""));
AgreementDemo ad=new AgreementDemo();
try {
System.out.println("*************************解析结果*************************");
ad.analysis(list.toString().replace(",","").replaceAll("\\[|\\]",""));
} catch (Exception e1) {
e1.printStackTrace();
System.out.println("解析出错!");
}
}
}
public byte[] getPack(){
byte[] pack1 = new byte[10];
for(int i=0;i<10;i++){
int newData = 0;
try{
if((newData = inputStream.read()) != -1){
// System.out.println("数据:" + newData);
pack1[i] = (byte) newData;
}
}catch (IOException e){
e.printStackTrace();
}
}
int packetLength=Integer.parseInt(String.valueOf(pack1[pack1.length-1]));
byte[] pack2 = new byte[packetLength+2];
//System.out.println(pack2.length);
for(int i=0;i<pack2.length;i++){
int newData = 0;
try{
if((newData = inputStream.read()) != -1){
pack2[i] = (byte) newData;
}
}catch (IOException e){
e.printStackTrace();
}
}
byte[] msgPack = new byte[pack1.length+pack2.length];
System.arraycopy(pack1,0,msgPack,0,pack1.length);
System.arraycopy(pack2,0,msgPack,pack1.length,pack2.length);
System.out.println("数据长度:" + msgPack.length);
return msgPack;
}
public String toHexString(byte[] data){
if(data == null || data.length == 0)
return null;
byte[] hex = new byte[data.length * 2];
int index = 0;
for(byte b : data){
int v = b & 0xFF;
hex[index++] = (byte) HEX_CHAR_TABLE[v >>> 4];
hex[index++] = (byte) HEX_CHAR_TABLE[v & 0xF];
}
return new String(hex);
}
public String toHexString(Byte[] data){
byte[] resultBytes = new byte[data.length];
for(int i =0 ;i<data.length;i++){
resultBytes[i] = data[i];
}
return toHexString(resultBytes);
}
public byte[] hexStringToBytes(String data){
if(data == null || "".equals(data))
return null;
data = data.toUpperCase();
int length = data.length()/2;
char[] dataChars = data.toCharArray();
byte[] byteData = new byte[length];
for (int i = 0;i<length;i++){
int pos = i * 2;
byteData[i] = (byte)(charToByte(dataChars[pos]) << 4 | charToByte(dataChars[pos + 1]));
}
return byteData;
}
public byte charToByte(char c){
return (byte)"0123456789ABCDEF".indexOf(c);
}
/* public int getPacketlength() {
return packetlength;
}
public void setPacketlength(int packetlength) {
this.packetlength = packetlength;
}*/
public static void main(String[] args){
Dlt645Test dlt645 = new Dlt645Test();
没有合适的资源?快使用搜索试试~ 我知道了~
Java版DLT645-2007电能表协议解析源码(串口协议解析)
共11个文件
class:3个
java:3个
properties:2个
1星 39 下载量 46 浏览量
2023-02-16
17:04:12
上传
评论
收藏 20KB ZIP 举报
温馨提示
Java版DL/T645-2007电能表协议解析源码(串口协议解析),DT/L645-2007电能表协议解析源码+串口编程源码,利用串口编程直接与电能表通信,Java版源码
资源推荐
资源详情
资源评论
收起资源包目录
Java版DLT645-2007协议解析源码(串口协议).zip (11个子文件)
Java版DLT645-2007协议解析源码(串口协议)
Agreement_wu
src
Test.java 5KB
Dlt645Test.java 8KB
AgreementDemo.java 7KB
config.properties 1KB
out
production
Agreement
Dlt645Test.class 8KB
Test.class 2KB
AgreementDemo.class 6KB
config.properties 1KB
web
WEB-INF
web.xml 304B
index.jsp 314B
Agreement.iml 868B
共 11 条
- 1
资源评论
- LearnBC2023-10-17Java版DLT645-2007协议解析源码(串口协议)
泡壶好茶
- 粉丝: 64
- 资源: 91
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功