代碼如下:
package com.boco.util;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.CharBuffer;
import java.util.Random;
/**
* 串口操作實作類
* @author Anlw
*
*/
public class Port implements SerialPortEventListener {
private CommPortIdentifier portId;
private SerialPort serialPort;
private OutputStreamWriter out;
private InputStreamReader in;
private String COMname;
public String getCOMname() {
return COMname;
}
public void setCOMname(String mname) {
COMname = mname;
}
public CommPortIdentifier getPortId() {
return portId;
}
public void setPortId(CommPortIdentifier portId) {
this.portId = portId;
}
public SerialPort getSerialPort() {
return serialPort;
}
public void setSerialPort(SerialPort serialPort) {
this.serialPort = serialPort;
}
public OutputStreamWriter getOut() {
return out;
}
public void setOut(OutputStreamWriter out) {
this.out = out;
}
public InputStreamReader getIn() {
return in;
}
public void setIn(InputStreamReader in) {
this.in = in;
}
public boolean isused = true;
public boolean isIsused() {
return isused;
}
public void setIsused(boolean isused) {
this.isused = isused;
}
/**
* 構造器打開com口
* @param portName
* @return
*/
public Port(String portName) {
try {
portId = CommPortIdentifier.getPortIdentifier(portName);
if (portId == null) {
System.out.println("port is null");
}
try {
serialPort = (SerialPort) portId.open(getrechargeablePassword(), 20000);
} catch (PortInUseException e) {
System.gc();
System.out.println("COM埠被占用,請選擇正確的COM埠!!");
}
// 下面是初始化COM口的傳輸引數,如傳輸速率:9600等
try {
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
setCOMname(portId.getName());
setIsused(true);
} catch (Exception e) {
System.gc();
}
// 下面是得到用于和COM口通訊的輸入、輸出流。
try {
out = new OutputStreamWriter(serialPort.getOutputStream());
// serialPort.setRTS(true);
in = new InputStreamReader(serialPort.getInputStream());
// //向串口添加事件監聽物件。
// serialPort.addEventListener(this);
// //設定當埠有可用資料時觸發事件,此設定必不可少。
// serialPort.notifyOnDataAvailable(true);
} catch (Exception e) {
System.gc();
}
} catch (NoSuchPortException e) {
System.gc();
System.out.println("無此COM埠,請選擇正確的COM埠!!");
}
}
// 獲取密碼
public static String getrechargeablePassword() {
Random random = new Random();
char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'c',
'b', 'd', 'f', 'e', 'g', 'h', 'j', 'i', 'l', 'k', 'n', 'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'w',
'v' };
String strRand = "";
for (int i = 0; i < 18; i++) {
strRand = strRand + String.valueOf(codeSequence[random.nextInt(59)]);
}
return strRand;
}
/**
* 關閉COM口
* @return boolean
*/
public void close() {
try {
in.close();
out.close();
serialPort.close();
System.gc();
setIsused(false);
} catch (Exception e) {
}
}
/**
* 向串口中寫入字串命令
* @param s 字串命令
* @throws Exception 例外
*/
public void writeln(String s) throws Exception {
out.write(s);
out.write('\r');
out.flush();
}
/**
* 讀取COM命令的回傳字串
* @return 結果字串
* @throws Exception
*/
public String read(){
int n, i;
char c;
String answer = "";
for (i = 0; i < 100; i++) {
try {
while (in.ready()) {
n = in.read();
if (n != -1) {
c = (char) n;
answer = answer + c;
Thread.sleep(1);
} else
break;
}
if(!"".equals(answer)){
System.out.println(answer);
}
Thread.sleep(100);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (answer.indexOf("OK") != -1) {
break;
}
}
return answer;
}
/**
* 向串口發送AT指令
* @param atcommand 指令內容
* @return 指令回傳結果
* @throws java.rmi.RemoteException
*/
public String sendAT(String atcommand) throws java.rmi.RemoteException {
String returnStr = "";
try {
Thread.sleep(100);
writeln(atcommand);
System.out.println(atcommand);
Thread.sleep(800);
returnStr = read();
System.out.println(returnStr+"---AT回傳值");
Thread.sleep(150);
} catch (Exception e) {
System.gc();
}
return returnStr;
}
//監聽注釋了,和沒有用監聽一個道理獲取不到回傳值
@Override
public void serialEvent(SerialPortEvent event) {
System.out.println("進入監聽!");
switch (event.getEventType()) {
case SerialPortEvent.BI:
System.out.println("通訊中斷");
case SerialPortEvent.OE:
System.out.println("溢位錯誤");
case SerialPortEvent.FE:
System.out.println("幀錯誤");
case SerialPortEvent.PE:
System.out.println("奇偶校驗錯");
case SerialPortEvent.CD:
System.out.println("載波檢測");
case SerialPortEvent.CTS:
System.out.println("清除發送");
case SerialPortEvent.DSR:
System.out.println("資料設備準備好");
case SerialPortEvent.RI:
System.out.println("振鈴指示");
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
System.out.println("輸出緩沖區已清空");
break;
case SerialPortEvent.DATA_AVAILABLE:
try{
int n, i;
char c;
String answer = "";
for (i = 0; i < 100; i++) {
while (in.ready()) {
n = in.read();
//System.out.println(n+"--n的值");
if (n != -1) {
c = (char) n;
answer = answer + c;
} else
break;
}
if(answer!=""&&!answer.equals(""));
System.out.println(answer);
// if (answer.indexOf("OK") != -1) {
// break;
// }
}
}catch(Exception e){
e.printStackTrace();
}
break;
}
}
}
uj5u.com熱心網友回復:
大神在哪里啊!!uj5u.com熱心網友回復:
我也遇到這樣的問題,樓主解決了嗎uj5u.com熱心網友回復:
串口工具類一般問題不大,CSDN里就有很多,不過看你這個好像有點問題,添加串口監聽,檢查一下你發送的報文是否正確,發送的時候一般都是按16進制發送,才會回傳正確資料,讀取串口資料,字串轉換轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/52245.html
標籤:Java相關
上一篇:使用myeclipse實作驗證碼
下一篇:java安裝
