摘要:串口通信以自己剛做的功能做為核心記錄這篇博客是基于通信協(xié)議之間的通信是十六進制進行通信的可選波特率,數(shù)據(jù)位停止位采用校驗功能和代碼的實現(xiàn)界面是用窗體表現(xiàn)的界面的實現(xiàn)就不過多的貼代碼和說怎么去實現(xiàn)了,有個很好用的工具,可以直接拖控件,跟做很像
串口通信以自己剛做的功能做為核心記錄這篇博客
①. 是基于modbus通信協(xié)議之間的通信
②. 是十六進制進行通信的
③. 可選波特率,數(shù)據(jù)位 停止位
④. 采用CRC校驗
界面是用窗體表現(xiàn)的
界面的實現(xiàn)就不過多的貼代碼和說怎么去實現(xiàn)了,有個很好用的工具 NETBean,可以直接拖控件,跟C#做winfrom很像,但是eclipse沒有 要自己布局的話比較耗時。ok,先說窗體下半部分的實現(xiàn)需要用到的jar包:comm.jar ,可以在網(wǎng)上搜下如何配置
void listPort() { CommPortIdentifier portId; //這個類在comm.jar中 Enumeration a = CommPortIdentifier.getPortIdentifiers(); while (a.hasMoreElements()) { portId = (CommPortIdentifier) a.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { list.add(portId.getName()); //這里的list是個成員變量,add之后再下拉框中刷新進去 } } }
波特率,數(shù)據(jù)位這些可以直接事先放在數(shù)組里面,界面一啟動就加 載進去了
二.打開串口public void selectPort(String portName, int rate, int databit, int stopbit,int parity) { System.out.println("selectPort()"); this.commPort = null; CommPortIdentifier cpid; Enumeration en = CommPortIdentifier.getPortIdentifiers(); // 枚舉出所 有的串口 while (en.hasMoreElements()) { cpid = (CommPortIdentifier) en.nextElement(); if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL&& cpid.getName().equals(portName)) { this.commPort = cpid; break; } } openPort(rate, databit, stopbit, parity); }
/** * @功能:打開串口 ** **/ private void openPort(int rate, int databit, int stopbit, int parity) { System.out.println("openPort()"); // TODO Auto-generated method stub if (commPort == null) //無法找到這個端口 else { //成功找到 try { serialPort = (SerialPort) commPort.open(appName, timeout); try { serialPort.setSerialPortParams(rate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);//這里過來參數(shù)是int,要轉(zhuǎn)成16進制,為了方便看代碼我就不轉(zhuǎn)化,直接用他的變量了 } catch (UnsupportedCommOperationException e) { // TODO Auto-generated catch block e.printStackTrace(); } log("實例SerialPort成功"); } catch (PortInUseException e) { throw new RuntimeException(String.format("端口為"%1$s"的串口正在被使用!", commPort.getName())); } } }
在寫上部分如何實現(xiàn)前,先說說掃描槍的工作相當(dāng)于最后的字符帶了回車的鍵盤輸入 ,就這樣.
將接收到的字符串轉(zhuǎn)換成16進制:
public static byte[] HexStringBytes(String src) { if (null == src || 0 == src.length()) { return null; } byte[] ret = new byte[src.length()/2]; byte[] tmp = src.getBytes(); // System.out.println("tmp="+Arrays.toString(tmp)); /* * int length = 0; if (tmp.length % 2 != 0) { length=(tmp.length+1)/2; } * length=tmp.length; */ for (int i = 0; i < (tmp.length / 2); i++) { ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]); } return ret; } /* * 以字節(jié)的形式寫進去 */ public void write(byte[] message) { System.out.println("write()"); checkPort(); try { outputStream = new BufferedOutputStream( serialPort.getOutputStream()); } catch (IOException e) { throw new RuntimeException("獲取端口的輸出流出錯"); } try { outputStream.write(message); log("信息發(fā)送成功"); } catch (IOException e) { throw new RuntimeException("向端口發(fā)送信息失敗"); } finally { try { outputStream.close(); } catch (Exception e) { } } }
附上dome下載:鏈接
推薦一款適合二次開發(fā)的掃描槍:MS3398迷你條碼掃描槍
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67336.html
摘要:二模塊原理藍牙模塊的通信示意圖如下兩個設(shè)備主控芯片或單片機分別連接各自的藍牙模塊,即將主控芯片與藍牙模塊的串口控制引腳交叉連接。如圖注藍牙模塊自帶轉(zhuǎn)電路。注博主演示的藍牙模塊雖然不是,但是功能和一樣。 ...
摘要:使用庫讀寫環(huán)境光照度傳感器本文將教大家如何快速使用庫讀取光照度數(shù)據(jù)。五實驗樣機測試展示通過之前配置好的面板,通過涂鴉智能進行配網(wǎng)實時采集光照度傳感器的數(shù)據(jù)。 使用STM32 HAL庫讀寫環(huán)境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫讀取光照度數(shù)據(jù)。 實現(xiàn)功能:通...
摘要:異步通信與同步通信異步通信異步通信是指通信的發(fā)送與接收設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收過程。同步通信同步通信時要建立發(fā)送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。配置串口設(shè)置為異步通信基礎(chǔ)參數(shù)波特率為。 ...
閱讀 3371·2021-11-11 16:54
閱讀 3526·2021-10-11 10:58
閱讀 1265·2021-08-30 09:41
閱讀 1809·2019-08-30 15:54
閱讀 2036·2019-08-30 14:00
閱讀 2710·2019-08-29 17:13
閱讀 1678·2019-08-29 15:19
閱讀 614·2019-08-29 15:14