1. 程式人生 > >Java中基於Rxtx的串列埠操作

Java中基於Rxtx的串列埠操作

/**
 * 串列埠引數的配置 串列埠一般有如下引數可以在該串列埠開啟以前進行配置:
 * 包括波特率,輸入/輸出流控制,資料位數,停止位和奇偶校驗。
 */
// 注:串列埠操作類一定要繼承SerialPortEventListener 
public class SerialPortTest1 implements SerialPortEventListener {
	// 檢測系統中可用的通訊埠類 
	private CommPortIdentifier portId;
	// 列舉型別
	private Enumeration<CommPortIdentifier> portList;

	// RS232串列埠
	private SerialPort serialPort;

	// 輸入輸出流
	private InputStream inputStream;
	private OutputStream outputStream;

	// 儲存串列埠返回資訊
	private String test = "";

	// 單例建立
	private static SerialPortTest1 uniqueInstance = new SerialPortTest1();

	// 初始化串列埠
	@SuppressWarnings("unchecked")
	public void init() {
		// 獲取系統中所有的通訊埠
		portList = CommPortIdentifier.getPortIdentifiers();
		// 迴圈通訊埠
		while (portList.hasMoreElements()) {
			portId = portList.nextElement();
			// 判斷是否是串列埠
			if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
				// 比較串列埠名稱是否是"COM1"
				if ("COM1".equals(portId.getName())) {
					System.out.println("找到串列埠COM1");
					// 開啟串列埠
					try {
						// open:(應用程式名【隨意命名】,阻塞時等待的毫秒數)
						serialPort = (SerialPort) portId.open(Object.class.getSimpleName(), 2000);
						System.out.println("獲取到串列埠物件,COM1");
						// 設定串列埠監聽
						serialPort.addEventListener(this);
						// 設定串列埠資料時間有效(可監聽)
						serialPort.notifyOnDataAvailable(true);
						// 設定串列埠通訊引數 
						// 波特率,資料位,停止位和校驗方式
						// 波特率2400,偶校驗 
						serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,//
								SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
						test = "";
						outputStream = serialPort.getOutputStream();

					} catch (PortInUseException e) {
						e.printStackTrace();
					} catch (TooManyListenersException e) {
						e.printStackTrace();
					} catch (UnsupportedCommOperationException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}

				}
			}
		}
	}

	// 實現介面SerialPortEventListener中的方法 讀取從串列埠中接收的資料
	@Override
	public void serialEvent(SerialPortEvent event) {
		switch (event.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:	//有資料到達
			readComm();
			break;
		default:
			break;
		}
	}

	// 讀取串列埠返回資訊
	public void readComm() {
		byte[] readBuffer = new byte[1024];
		try {
			inputStream = serialPort.getInputStream();
			// 從線路上讀取資料流
			int len = 0;
			while ((len = inputStream.read(readBuffer)) != -1) {
				System.out.println("實時反饋:" + new String(readBuffer, 0, len).trim() + new Date());
				test += new String(readBuffer, 0, len).trim();
				break;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 關閉串列埠
	public void closeSerialPort() {
		if (serialPort != null) {
			serialPort.notifyOnDataAvailable(false);
			serialPort.removeEventListener();
			if (inputStream != null) {
				try {
					inputStream.close();
					inputStream = null;
				}
				catch (IOException e) {}
			}
			if (outputStream != null) {
				try {
					outputStream.close();
					outputStream = null;
				}
				catch (IOException e) {}
			}
			serialPort.close();
			serialPort = null;
		}
	}

	public static void main(String[] args) {
		SerialPortTest1 sp = new SerialPortTest1();
		sp.init();
		System.out.println("輸出" + sp.test);
		sp.closeSerialPort();
	}
}

之後,用虛擬串列埠工具VSPD建立兩個串列埠,COM1和COM2,執行java程式,開啟串列埠除錯助手,從COM2向COM1傳送資料,java程式就可以在控制檯輸出資訊了。