?關于java使用javacomm20-win32實踐總結?
???????????????由于這幾天要通過java調用通過串口或并口連接的硬件資源,所以我就要用到和底層的硬件進行通訊。通過RS-232的通訊協議,了解電腦和外設是怎樣進行通訊的。在應用中我們也可以通過JNI來實現(詳情請見http://www.blogjava.net/hgq0011/archive/2005/09/21/13637.html),這樣的話,就必須知道更多的知識。由于
java已經提供我們一個javacomm20-win32通用的API我們還是實行 “拿來主義”
吧。我就把整個應用的過程詳細的說一下,希望給需要的人一點幫助。?
????????????我們經過串口和外設通訊,下面我就以
串口為例進行解說
。?
????????????1)我們要準備相應的設備。
??????????????????電腦,外設,通過數據線把他們連接起來。?
????????????2)檢驗外設到底是用的那個COM口和電腦通訊的。
??????????????????也就是說,他們有沒有真確的連接上。我們可以通過下載串口通訊口測試軟件,我用的是
"SuperCommTool.exe"的綠色軟件,進行測試的
。這軟件很適應,如果選中的某個COM已經被使用了,它會給你一個相應的提示(端口以被占用)。如果你不知道到底是使用的那個端口,那么你可以通過superCommTool軟件一個一個的試,如果正常的話,那么你可以看到有數據顯示在數據接收窗口。也許,有些主板的串口壞了,那么你就要買一個轉接卡,通過PCI插口轉接。?
????????????3)察看外設使用說明書知道外設的相關參數。
???????????????比如,波特率,數據位,停止位,校驗位,等等。只有正確參數,才能顯示正確的數據。當然,你可以在通訊測試軟件上調試這些參數的。比如:波特率 = 2400,數據位 = 8,停止位 = 2 ,校驗位 = 1。?
????????????4)準備開發環境。
????????????最基本的JDK了,你可以使用自己鐘愛的IDE,幫助你開發。IDE可能自帶了JDK,那么 你要把相應的javaComm20-win32放到運行時使用的JDK中。 下載JAVAcomm20-win32。
??????????5)了解javaComm20-win32。
????????????你必須把win32com.dll復制到java.home/bin下;把javax.comm.properties 復制到java.home/lib下;把comm.jar添加到你classPath下。
前面兩個都是非常重要的
。?
?????????????下面說明用到的幾個類:?
??????????????????
javax.comm.CommPortIdentifier?
?????????????????????通訊端口管理器,CommPortIdentifier是控制訪問到通訊端口的中 心類。
?????????????????????它包括的方法有:?
???????????????????????????a. 通過驅動決定通訊端口是可用的。?
???????????????????????????b. 打開通訊端口為了I/O操作。?
???????????????????????????c. 決定端口的擁有者。?
???????????????????????????d. 解析端口擁有者的爭奪。?
???????????????????????????e. 管理事件顯示在端口擁有者的中的狀態改變。?
?????????????????????一個應用程序首先使用CommPortIdentifier中的方法,通過相關的驅動去獲取那些通訊端口是可用的 并且選擇一個端口便于開始。然后它使用方法在其它類中想CommPort,ParallelPort和SerialPort通過 這個端口進行通訊。?
??????????????????
javax.comm.SerialPort
?
?????????????????????一個RS-232串口通訊端口。SerialPort 描述底層的接口到一個串口通訊端口 變得有效的通過底層的系統。SerialPort定義最小的必需的功能便于串口通訊端口。?
??????????????????
javax.comm.SerialPortEventListener
?
?????????????????????串行端口事件傳播。?
??????????????????
javax.comm.CommDriver
?
?????????6)代碼的編寫。?
???????????????a. 獲取SerialPort sPort對象的兩種方法。
???????????????????1)
??????????????????????????????javax.comm.CommDriver?driver? = ? null ;?
??????????????????????????????String?driverName? = ? " com.sun.comm.Win32Driver " ;?
????????????????????????????? SerialPort?sPort? = ?(SerialPort)?driver.getCommPort( " COM4 " ,?CommPortIdentifier.PORT_SERIAL);?
??????????????????2)
?????????????????????????? SerialPort?sPort? = ?(SerialPort)portId.open( " shipment " , 1000 );
?????????????以上兩種方法都可以。不過一般都會采用第二種。方法說明我們獲取了對串行端口(COM4),可以和它進行通訊了。?
??????????????b. 設置串行端口通訊參數。
?
???????????????c. 獲取輸入(出)流。?
??????????????????
?????????????? ? OutputStream?os?=?sPort.getOutputStream() ; // 發送命令到外設
???????????????d.通過監聽器就可以得到數據了。
??????????????????
?2 ????????????sPort.notifyOnDataAvailable( true );
?3
?4 ????????????? // ?Set?notifyOnBreakInterrup?to?allow?event?driven?break?handling.
?5 ????????????sPort.notifyOnBreakInterrupt( true );
?6
?7 ????????????? // ?Set?receive?timeout?to?allow?breaking?out?of?polling?loop?during??input?handling.
?8 ????????????sPort.enableReceiveTimeout( 30 );
?9 ????????????StringBuffer?linkWgt? = ? new ?StringBuffer(); // 存放獲取的數據
10 ????????????sPort.addEventListener(?
11 ???????????????? new ?SerialPortEventListener() {
12 ???????????????????? public ? void ?serialEvent(SerialPortEvent?e) {
13 ???????????????????????? int ?newData? = ? 0 ;
14 ???????????????????????? // ?Determine?type?of?event.
15 ???????????????????????? switch ?(e.getEventType())? {
16 ???????????????????????? // ?Read?data?until?-1?is?returned.?If?\r?is?received?substitute
17 ???????????????????????????? // ?\n?for?correct?newline?handling.
18 ???????????????????????????? case ?SerialPortEvent.DATA_AVAILABLE:
19 ???????????????????????????????? while ?(newData? != ? - 1 )? {
20 ???????????????????????????????????? try ? {
21 ????????????????????????????????????????newData? = ?is.read();
22 ???????????????????????????????????????? if ?(newData? == ? - 1 )? {
23 ???????????????????????????????????????????? break ;
24 ????????????????????????????????????????}
25 ???????????????????????????????????????? if ?( ' \r ' ? == ?( char )newData)? {
26 ????????????????????????????????????????} ? else ? {
27 ????????????????????????????????????????????linkWgt.append(( char )newData);
28

29

30 ????????????????????????????????????????System.err.println(ex);
31 ???????????????????????????????????????? return ;
32 ????????????????????????????????????}
33 ????????????????????????????????}
34
35 ???????????????????????????? // ?Append?received?data?to?messageAreaIn.
36 ????????????????????????????
37 ????????????????????????????? try {
38 ????????????????????????????????System.out.println( " linkWgt?---------|||||?????????? " + Double.valueOf(linkWgt.toString()));
39 ????????????????????????????????
40 ?????????????????????????????} catch (Exception?ew) {
41 ?????????????????????????????????ew.printStackTrace();
42 ?????????????????????????????} finally {
43 ????????????????????????????????? try {
44 ???????????????????????????????????? // 用完了,記得關閉端口。
45 ?????????????????????????????????????is.close();
46 ????????????????????????????????????sPort.close();
47 ?????????????????????????????????} catch (Exception?c) {
48 ?????????????????????????????????????c.printStackTrace();
49 ?????????????????????????????????}
50 ?????????????????????????????}
51 ???????????????????????????? break ;
52 ???????????????????????????? // ?If?break?event?append?BREAK?RECEIVED?message.
53 ???????????????????????????? case ?SerialPortEvent.BI:
54 ????????????????????????????????System.out.println( " \n---?BREAK?RECEIVED?---\n " );
55 ????????????????????????}
56 ????????????????????}
57
58 ????????????????}
59 ????????????);
??????????7)常見的異常
????????????????a. javax.comm.NoSuchPortException 這個說明你的javax.comm.properties沒有放到正確的位置。
?如果有什么不正確的地方,歡迎批評指正,謝謝!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
