一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - 使用Java實現串口通信

使用Java實現串口通信

2020-07-15 12:08容華謝后 JAVA教程

這篇文章主要為大家詳細介紹了使用Java實現串口通信的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Java實現串口通信的具體代碼,供大家參考,具體內容如下

1.介紹

使用Java實現的串口通信程序,支持十六進制數據的發送與接收。
源碼:SerialPortDemo

效果圖如下:

使用Java實現串口通信

2.RXTXcomm

Java串口通信依賴的jar包RXTXcomm.jar
下載地址:http://download.csdn.net/detail/kong_gu_you_lan/9611334

內含32位與64位版本
使用方法:
拷貝 RXTXcomm.jar 到 JAVA_HOME\jre\lib\ext目錄中;
拷貝 rxtxSerial.dll 到 JAVA_HOME\jre\bin目錄中;
拷貝 rxtxParallel.dll 到 JAVA_HOME\jre\bin目錄中;
JAVA_HOME為jdk安裝路徑

3.串口通信管理

SerialPortManager實現了對串口通信的管理,包括查找可用端口、打開關閉串口、發送接收數據。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
package com.yang.serialport.manage;
 
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.TooManyListenersException;
 
import com.yang.serialport.exception.NoSuchPort;
import com.yang.serialport.exception.NotASerialPort;
import com.yang.serialport.exception.PortInUse;
import com.yang.serialport.exception.ReadDataFromSerialPortFailure;
import com.yang.serialport.exception.SendDataToSerialPortFailure;
import com.yang.serialport.exception.SerialPortInputStreamCloseFailure;
import com.yang.serialport.exception.SerialPortOutputStreamCloseFailure;
import com.yang.serialport.exception.SerialPortParameterFailure;
import com.yang.serialport.exception.TooManyListeners;
 
/**
 * 串口管理
 *
 * @author yangle
 */
public class SerialPortManager {
 
 /**
 * 查找所有可用端口
 *
 * @return 可用端口名稱列表
 */
 @SuppressWarnings("unchecked")
 public static final ArrayList<String> findPort() {
 // 獲得當前所有可用串口
 Enumeration<CommPortIdentifier> portList = CommPortIdentifier
  .getPortIdentifiers();
 ArrayList<String> portNameList = new ArrayList<String>();
 // 將可用串口名添加到List并返回該List
 while (portList.hasMoreElements()) {
  String portName = portList.nextElement().getName();
  portNameList.add(portName);
 }
 return portNameList;
 }
 
 /**
 * 打開串口
 *
 * @param portName
 *  端口名稱
 * @param baudrate
 *  波特率
 * @return 串口對象
 * @throws SerialPortParameterFailure
 *  設置串口參數失敗
 * @throws NotASerialPort
 *  端口指向設備不是串口類型
 * @throws NoSuchPort
 *  沒有該端口對應的串口設備
 * @throws PortInUse
 *  端口已被占用
 */
 public static final SerialPort openPort(String portName, int baudrate)
  throws SerialPortParameterFailure, NotASerialPort, NoSuchPort,
  PortInUse {
 try {
  // 通過端口名識別端口
  CommPortIdentifier portIdentifier = CommPortIdentifier
   .getPortIdentifier(portName);
  // 打開端口,設置端口名與timeout(打開操作的超時時間)
  CommPort commPort = portIdentifier.open(portName, 2000);
  // 判斷是不是串口
  if (commPort instanceof SerialPort) {
  SerialPort serialPort = (SerialPort) commPort;
  try {
   // 設置串口的波特率等參數
   serialPort.setSerialPortParams(baudrate,
    SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
    SerialPort.PARITY_NONE);
  } catch (UnsupportedCommOperationException e) {
   throw new SerialPortParameterFailure();
  }
  return serialPort;
  } else {
  // 不是串口
  throw new NotASerialPort();
  }
 } catch (NoSuchPortException e1) {
  throw new NoSuchPort();
 } catch (PortInUseException e2) {
  throw new PortInUse();
 }
 }
 
 /**
 * 關閉串口
 *
 * @param serialport
 *  待關閉的串口對象
 */
 public static void closePort(SerialPort serialPort) {
 if (serialPort != null) {
  serialPort.close();
  serialPort = null;
 }
 }
 
 /**
 * 向串口發送數據
 *
 * @param serialPort
 *  串口對象
 * @param order
 *  待發送數據
 * @throws SendDataToSerialPortFailure
 *  向串口發送數據失敗
 * @throws SerialPortOutputStreamCloseFailure
 *  關閉串口對象的輸出流出錯
 */
 public static void sendToPort(SerialPort serialPort, byte[] order)
  throws SendDataToSerialPortFailure,
  SerialPortOutputStreamCloseFailure {
 OutputStream out = null;
 try {
  out = serialPort.getOutputStream();
  out.write(order);
  out.flush();
 } catch (IOException e) {
  throw new SendDataToSerialPortFailure();
 } finally {
  try {
  if (out != null) {
   out.close();
   out = null;
  }
  } catch (IOException e) {
  throw new SerialPortOutputStreamCloseFailure();
  }
 }
 }
 
 /**
 * 從串口讀取數據
 *
 * @param serialPort
 *  當前已建立連接的SerialPort對象
 * @return 讀取到的數據
 * @throws ReadDataFromSerialPortFailure
 *  從串口讀取數據時出錯
 * @throws SerialPortInputStreamCloseFailure
 *  關閉串口對象輸入流出錯
 */
 public static byte[] readFromPort(SerialPort serialPort)
  throws ReadDataFromSerialPortFailure,
  SerialPortInputStreamCloseFailure {
 InputStream in = null;
 byte[] bytes = null;
 try {
  in = serialPort.getInputStream();
  // 獲取buffer里的數據長度
  int bufflenth = in.available();
  while (bufflenth != 0) {
  // 初始化byte數組為buffer中數據的長度
  bytes = new byte[bufflenth];
  in.read(bytes);
  bufflenth = in.available();
  }
 } catch (IOException e) {
  throw new ReadDataFromSerialPortFailure();
 } finally {
  try {
  if (in != null) {
   in.close();
   in = null;
  }
  } catch (IOException e) {
  throw new SerialPortInputStreamCloseFailure();
  }
 }
 return bytes;
 }
 
 /**
 * 添加監聽器
 *
 * @param port
 *  串口對象
 * @param listener
 *  串口監聽器
 * @throws TooManyListeners
 *  監聽類對象過多
 */
 public static void addListener(SerialPort port,
  SerialPortEventListener listener) throws TooManyListeners {
 try {
  // 給串口添加監聽器
  port.addEventListener(listener);
  // 設置當有數據到達時喚醒監聽接收線程
  port.notifyOnDataAvailable(true);
  // 設置當通信中斷時喚醒中斷線程
  port.notifyOnBreakInterrupt(true);
 } catch (TooManyListenersException e) {
  throw new TooManyListeners();
 }
 }
}

4.程序主窗口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
/*
 * MainFrame.java
 *
 * Created on 2016.8.19
 */
 
package com.yang.serialport.ui;
 
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
 
import java.awt.Color;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
 
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
import com.yang.serialport.exception.NoSuchPort;
import com.yang.serialport.exception.NotASerialPort;
import com.yang.serialport.exception.PortInUse;
import com.yang.serialport.exception.SendDataToSerialPortFailure;
import com.yang.serialport.exception.SerialPortOutputStreamCloseFailure;
import com.yang.serialport.exception.SerialPortParameterFailure;
import com.yang.serialport.exception.TooManyListeners;
import com.yang.serialport.manage.SerialPortManager;
import com.yang.serialport.utils.ByteUtils;
import com.yang.serialport.utils.ShowUtils;
 
/**
 * 主界面
 *
 * @author yangle
 */
public class MainFrame extends JFrame {
 
 /**
 * 程序界面寬度
 */
 public static final int WIDTH = 500;
 
 /**
 * 程序界面高度
 */
 public static final int HEIGHT = 360;
 
 private JTextArea dataView = new JTextArea();
 private JScrollPane scrollDataView = new JScrollPane(dataView);
 
 // 串口設置面板
 private JPanel serialPortPanel = new JPanel();
 private JLabel serialPortLabel = new JLabel("串口");
 private JLabel baudrateLabel = new JLabel("波特率");
 private JComboBox commChoice = new JComboBox();
 private JComboBox baudrateChoice = new JComboBox();
 
 // 操作面板
 private JPanel operatePanel = new JPanel();
 private JTextField dataInput = new JTextField();
 private JButton serialPortOperate = new JButton("打開串口");
 private JButton sendData = new JButton("發送數據");
 
 private List<String> commList = null;
 private SerialPort serialport;
 
 public MainFrame() {
 initView();
 initComponents();
 actionListener();
 initData();
 }
 
 private void initView() {
 // 關閉程序
 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 // 禁止窗口最大化
 setResizable(false);
 
 // 設置程序窗口居中顯示
 Point p = GraphicsEnvironment.getLocalGraphicsEnvironment()
  .getCenterPoint();
 setBounds(p.x - WIDTH / 2, p.y - HEIGHT / 2, WIDTH, HEIGHT);
 this.setLayout(null);
 
 setTitle("串口通訊");
 }
 
 private void initComponents() {
 // 數據顯示
 dataView.setFocusable(false);
 scrollDataView.setBounds(10, 10, 475, 200);
 add(scrollDataView);
 
 // 串口設置
 serialPortPanel.setBorder(BorderFactory.createTitledBorder("串口設置"));
 serialPortPanel.setBounds(10, 220, 170, 100);
 serialPortPanel.setLayout(null);
 add(serialPortPanel);
 
 serialPortLabel.setForeground(Color.gray);
 serialPortLabel.setBounds(10, 25, 40, 20);
 serialPortPanel.add(serialPortLabel);
 
 commChoice.setFocusable(false);
 commChoice.setBounds(60, 25, 100, 20);
 serialPortPanel.add(commChoice);
 
 baudrateLabel.setForeground(Color.gray);
 baudrateLabel.setBounds(10, 60, 40, 20);
 serialPortPanel.add(baudrateLabel);
 
 baudrateChoice.setFocusable(false);
 baudrateChoice.setBounds(60, 60, 100, 20);
 serialPortPanel.add(baudrateChoice);
 
 // 操作
 operatePanel.setBorder(BorderFactory.createTitledBorder("操作"));
 operatePanel.setBounds(200, 220, 285, 100);
 operatePanel.setLayout(null);
 add(operatePanel);
 
 dataInput.setBounds(25, 25, 235, 20);
 operatePanel.add(dataInput);
 
 serialPortOperate.setFocusable(false);
 serialPortOperate.setBounds(45, 60, 90, 20);
 operatePanel.add(serialPortOperate);
 
 sendData.setFocusable(false);
 sendData.setBounds(155, 60, 90, 20);
 operatePanel.add(sendData);
 }
 
 @SuppressWarnings("unchecked")
 private void initData() {
 commList = SerialPortManager.findPort();
 // 檢查是否有可用串口,有則加入選項中
 if (commList == null || commList.size() < 1) {
  ShowUtils.warningMessage("沒有搜索到有效串口!");
 } else {
  for (String s : commList) {
  commChoice.addItem(s);
  }
 }
 
 baudrateChoice.addItem("9600");
 baudrateChoice.addItem("19200");
 baudrateChoice.addItem("38400");
 baudrateChoice.addItem("57600");
 baudrateChoice.addItem("115200");
 }
 
 private void actionListener() {
 serialPortOperate.addActionListener(new ActionListener() {
 
  @Override
  public void actionPerformed(ActionEvent e) {
  if ("打開串口".equals(serialPortOperate.getText())
   && serialport == null) {
   openSerialPort(e);
  } else {
   closeSerialPort(e);
  }
  }
 });
 
 sendData.addActionListener(new ActionListener() {
 
  @Override
  public void actionPerformed(ActionEvent e) {
  sendData(e);
  }
 });
 }
 
 /**
 * 打開串口
 *
 * @param evt
 *  點擊事件
 */
 private void openSerialPort(java.awt.event.ActionEvent evt) {
 // 獲取串口名稱
 String commName = (String) commChoice.getSelectedItem();
 // 獲取波特率
 int baudrate = 9600;
 String bps = (String) baudrateChoice.getSelectedItem();
 baudrate = Integer.parseInt(bps);
 
 // 檢查串口名稱是否獲取正確
 if (commName == null || commName.equals("")) {
  ShowUtils.warningMessage("沒有搜索到有效串口!");
 } else {
  try {
  serialport = SerialPortManager.openPort(commName, baudrate);
  if (serialport != null) {
   dataView.setText("串口已打開" + "\r\n");
   serialPortOperate.setText("關閉串口");
  }
  } catch (SerialPortParameterFailure e) {
  e.printStackTrace();
  } catch (NotASerialPort e) {
  e.printStackTrace();
  } catch (NoSuchPort e) {
  e.printStackTrace();
  } catch (PortInUse e) {
  e.printStackTrace();
  ShowUtils.warningMessage("串口已被占用!");
  }
 }
 
 try {
  SerialPortManager.addListener(serialport, new SerialListener());
 } catch (TooManyListeners e) {
  e.printStackTrace();
 }
 }
 
 /**
 * 關閉串口
 *
 * @param evt
 *  點擊事件
 */
 private void closeSerialPort(java.awt.event.ActionEvent evt) {
 SerialPortManager.closePort(serialport);
 dataView.setText("串口已關閉" + "\r\n");
 serialPortOperate.setText("打開串口");
 }
 
 /**
 * 發送數據
 *
 * @param evt
 *  點擊事件
 */
 private void sendData(java.awt.event.ActionEvent evt) {
 // 輸入框直接輸入十六進制字符,長度必須是偶數
 String data = dataInput.getText().toString();
 try {
  SerialPortManager.sendToPort(serialport,
   ByteUtils.hexStr2Byte(data));
 } catch (SendDataToSerialPortFailure e) {
  e.printStackTrace();
 } catch (SerialPortOutputStreamCloseFailure e) {
  e.printStackTrace();
 }
 }
 
 private class SerialListener implements SerialPortEventListener {
 /**
  * 處理監控到的串口事件
  */
 public void serialEvent(SerialPortEvent serialPortEvent) {
 
  switch (serialPortEvent.getEventType()) {
 
  case SerialPortEvent.BI: // 10 通訊中斷
  ShowUtils.errorMessage("與串口設備通訊中斷");
  break;
 
  case SerialPortEvent.OE: // 7 溢位(溢出)錯誤
 
  case SerialPortEvent.FE: // 9 幀錯誤
 
  case SerialPortEvent.PE: // 8 奇偶校驗錯誤
 
  case SerialPortEvent.CD: // 6 載波檢測
 
  case SerialPortEvent.CTS: // 3 清除待發送數據
 
  case SerialPortEvent.DSR: // 4 待發送數據準備好了
 
  case SerialPortEvent.RI: // 5 振鈴指示
 
  case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 輸出緩沖區已清空
  break;
 
  case SerialPortEvent.DATA_AVAILABLE: // 1 串口存在可用數據
  byte[] data = null;
  try {
   if (serialport == null) {
   ShowUtils.errorMessage("串口對象為空!監聽失敗!");
   } else {
   // 讀取串口數據
   data = SerialPortManager.readFromPort(serialport);
   dataView.append(ByteUtils.byteArrayToHexString(data,
    true) + "\r\n");
   }
  } catch (Exception e) {
   ShowUtils.errorMessage(e.toString());
   // 發生讀取錯誤時顯示錯誤信息后退出系統
   System.exit(0);
  }
  break;
  }
 }
 }
 
 public static void main(String args[]) {
 java.awt.EventQueue.invokeLater(new Runnable() {
  public void run() {
  new MainFrame().setVisible(true);
  }
 });
 }
}

5.寫在最后

源碼下載地址:SerialPortDemo

歡迎同學們吐槽評論,如果你覺得本篇博客對你有用,那么就留個言或者頂一下吧(^-^)

感謝:基于Java編寫串口通信工具

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/kong_gu_you_lan/article/details/52302075

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲男人第一天堂 | 性生大片免费看 | 日韩亚洲欧美理论片 | porono日本人xxx | 好吊妞乱淫 | 无限在线看免费视频大全 | 国语视频高清在线观看 | 国产精品久久亚洲一区二区 | 国产三级自拍视频 | 91插插插插| 国产午夜精品久久理论片小说 | 小鸟酱在线播放 | 亚洲国产一区二区a毛片 | 日本在线视频免费看 | 亚洲成年| 亚洲成A人片在线观看中文L | 精品久久久久久久久久久久久久久 | 九九99香蕉在线视频美国毛片 | 亚洲国产精品网 | 久久伊人精品青青草原2021 | 国产高清视频一区二区 | 亚洲国产日韩成人综合天堂 | 国产特级毛片aaaaaa | 交换年轻夫妇HD中文字幕 | 欧美一级视频在线高清观看 | 国产成人亚洲精品一区二区在线看 | bt天堂在线观看国产 | 免费的网址| 男人和女人日比 | 特黄特色一级aa毛片免费观看 | 操一操影院| 国产亚洲sss在线观看 | 娇妻被健身教练挺进小说阅读 | 日本高清不卡一区久久精品 | 国产在亚洲线视频观看 | 亚洲国产成人超福利久久精品 | 精品国产在线观看 | 日本在线视频免费观看 | 日韩成a人片在线观看日本 日韩不卡一区二区 | 日韩毛片高清在线看 | 日本黄色一区 |