追隨Java
          簡單的事情重復做,就會產(chǎn)生累積效應!
          posts - 260,  comments - 338,  trackbacks - 0
          ?????????????????????????????????關(guān)于java使用javacomm20-win32實踐總結(jié)?
          ???????????????由于這幾天要通過java調(diào)用通過串口或并口連接的硬件資源,所以我就要用到和底層的硬件進行通訊。通過RS-232的通訊協(xié)議,了解電腦和外設(shè)是怎樣進行通訊的。在應用中我們也可以通過JNI來實現(xiàn)(詳情請見http://www.aygfsteel.com/hgq0011/archive/2005/09/21/13637.html),這樣的話,就必須知道更多的知識。由于java已經(jīng)提供我們一個javacomm20-win32通用的API我們還是實行 “拿來主義”吧。我就把整個應用的過程詳細的說一下,希望給需要的人一點幫助。?
          ????????????我們經(jīng)過串口和外設(shè)通訊,下面我就以串口為例進行解說。?
          ????????????1)我們要準備相應的設(shè)備。
          ??????????????????電腦,外設(shè),通過數(shù)據(jù)線把他們連接起來。?
          ????????????2)檢驗外設(shè)到底是用的那個COM口和電腦通訊的。
          ??????????????????也就是說,他們有沒有真確的連接上。我們可以通過下載串口通訊口測試軟件,我用的是"SuperCommTool.exe"的綠色軟件,進行測試的。這軟件很適應,如果選中的某個COM已經(jīng)被使用了,它會給你一個相應的提示(端口以被占用)。如果你不知道到底是使用的那個端口,那么你可以通過superCommTool軟件一個一個的試,如果正常的話,那么你可以看到有數(shù)據(jù)顯示在數(shù)據(jù)接收窗口。也許,有些主板的串口壞了,那么你就要買一個轉(zhuǎn)接卡,通過PCI插口轉(zhuǎn)接。?
          ????????????3)察看外設(shè)使用說明書知道外設(shè)的相關(guān)參數(shù)。
          ???????????????比如,波特率,數(shù)據(jù)位,停止位,校驗位,等等。只有正確參數(shù),才能顯示正確的數(shù)據(jù)。當然,你可以在通訊測試軟件上調(diào)試這些參數(shù)的。比如:波特率 = 2400,數(shù)據(jù)位 = 8,停止位 = 2 ,校驗位 = 1。?
          ????????????4)準備開發(fā)環(huán)境。
          ????????????最基本的JDK了,你可以使用自己鐘愛的IDE,幫助你開發(fā)。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. 通過驅(qū)動決定通訊端口是可用的。?
          ???????????????????????????b. 打開通訊端口為了I/O操作。?
          ???????????????????????????c. 決定端口的擁有者。?
          ???????????????????????????d. 解析端口擁有者的爭奪。?
          ???????????????????????????e. 管理事件顯示在端口擁有者的中的狀態(tài)改變。?
          ?????????????????????一個應用程序首先使用CommPortIdentifier中的方法,通過相關(guān)的驅(qū)動去獲取那些通訊端口是可用的 并且選擇一個端口便于開始。然后它使用方法在其它類中想CommPort,ParallelPort和SerialPort通過 這個端口進行通訊。?
          ??????????????????javax.comm.SerialPort?
          ?????????????????????一個RS-232串口通訊端口。SerialPort 描述底層的接口到一個串口通訊端口 變得有效的通過底層的系統(tǒng)。SerialPort定義最小的必需的功能便于串口通訊端口。?
          ??????????????????javax.comm.SerialPortEventListener?
          ?????????????????????串行端口事件傳播。?
          ??????????????????javax.comm.CommDriver?
          ?????????6)代碼的編寫。?
          ???????????????a. 獲取SerialPort sPort對象的兩種方法。
          ???????????????????1)
          ???????????????????????????System.loadLibrary("win32com");?
          ??????????????????????????????javax.comm.CommDriver?driver?
          =?null;?
          ??????????????????????????????String?driverName?
          =?"com.sun.comm.Win32Driver";?
          ????????????????????????????? SerialPort?sPort?
          =?(SerialPort)?driver.getCommPort("COM4",?CommPortIdentifier.PORT_SERIAL);?
          ??????????????????2)
          ?????????????????????? CommPortIdentifier?portId?=?CommPortIdentifier.getPortIdentifier("COM4");?
          ?????????????????????????? SerialPort?sPort?
          =?(SerialPort)portId.open("shipment",1000);

          ?????????????以上兩種方法都可以。不過一般都會采用第二種。方法說明我們獲取了對串行端口(COM4),可以和它進行通訊了。?
          ??????????????b. 設(shè)置串行端口通訊參數(shù)。
          sPort.setSerialPortParams(2400,SerialPort.DATABITS_8,SerialPort.STOPBITS_2,SerialPort.PARITY_NONE);?

          ???????????????c. 獲取輸入(出)流。?
          ??????????????????
          ????????????InputStream?is?=?sPort.getInputStream();//從外設(shè)獲取數(shù)據(jù)?
          ?????????????? OutputStream?os?=?sPort.getOutputStream();
          //發(fā)送命令到外設(shè)
          ???????????????d.通過監(jiān)聽器就可以得到數(shù)據(jù)了。
          ??????????????????
          ?1//Set?notifyOnDataAvailable?to?true?to?allow?event?driven?input.
          ?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();//存放獲取的數(shù)據(jù)
          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????????????????????????????????????}
          ?catch?(IOException?ex)?{
          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????????????????????????????????????//用完了,記得關(guān)閉端口。
          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沒有放到正確的位置。
          ?如果有什么不正確的地方,歡迎批評指正,謝謝!
          posted on 2007-03-23 09:48 Harryson 閱讀(5975) 評論(4)  編輯  收藏 所屬分類: Jni--CommunicationJ2SE

          FeedBack:
          # re: 關(guān)于java使用javacomm20-win32實踐總結(jié)
          2007-03-23 12:18 | turbochen
          沒什么可補充的,有興趣可以參考一下我2004年寫的文章:
          http://blog.csdn.net/turbochen/archive/2004/05/07/8105.aspx
          關(guān)于win32com.dll可以就放在你的應用程序(.jar)所在的目錄。不用拔山涉水的放到java.home/bin下,破壞原目錄的內(nèi)容。  回復  更多評論
            
          # re: 關(guān)于java使用javacomm20-win32實踐總結(jié)
          2007-03-23 17:15 | Christ Chang
          原來那篇文章是你寫的,嚴重頂一下!!  回復  更多評論
            
          # re: 關(guān)于java使用javacomm20-win32實踐總結(jié)
          2007-09-21 00:16 | dxr
          頂一下!!!
          不過我沒有javax.comm類庫,從網(wǎng)上也下載不了,能給我傳一個嗎?
          我的郵箱是dxianr@163.com 先謝了!  回復  更多評論
            
          # re: 關(guān)于java使用javacomm20-win32實踐總結(jié)
          2013-01-31 12:28 | lsc
          javax.comm.CommDriver driver = null; diver沒有初始化吧?  回復  更多評論
            

          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          常用鏈接

          留言簿(10)

          隨筆分類(319)

          AJAX

          Coffee House

          CSS

          Java

          JavaScript

          Open Source

          ProjectManagement

          友情Blog

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 焦作市| 滦平县| 万年县| 家居| 临泉县| 汉沽区| 屯留县| 资兴市| 高清| 阜平县| 靖安县| 永福县| 红河县| 西乌珠穆沁旗| 凤凰县| 安顺市| 永清县| 凤阳县| 丰城市| 安远县| 白沙| 安顺市| 岑溪市| 通江县| 吉安县| 浪卡子县| 武清区| 蒙山县| 穆棱市| 西和县| 乐山市| 梨树县| 湖北省| 宜良县| 长葛市| 许昌市| 榆中县| 嘉义县| 武汉市| 玉门市| 商丘市|