熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

淺談Java串行端口技術協議

2013-11-23 19:20:54  來源: Java核心技術 

  串行通訊慨述
  串行通訊協議有很多種像RSRSRS甚至現今流行的USB等都是串行通訊協議而串行通訊技術的應用無處不在可能大家見的最多就是電腦的串口與Modem的通訊記得在PC機剛開始在中國流行起來時(大約是在年代前五年)那時甚至有人用一條串行線進行兩台電腦之間的數據共享除了這些手機PDAUSB鼠標鍵盤等等都是以串行通訊的方式與電腦連接而筆者工作性質的關系所接觸到的就更多了像多串口卡各種種類的具有串口通訊接口的檢測與測量儀器串口通訊的網絡設備等
  
  雖然串行通訊有很多種但筆者所知的在整個電子通訊產品方面以RS的通訊方式最為多見雖然USB接口的電子產品也是層出不窮但了解一下Java在串行通訊方面的技術還有有必要的說不定有哪位讀者還想用此技術寫一個PDA與電腦之間數據共享的程序呢
  
  本文主要以RS為主來講解Java的串行通訊技術
  
  RS通訊基礎
  RSC(又稱EIA RSC以下簡稱RS)是在年由美國電子工業協會(EIA)聯合貝爾系統調制解調器廠家及計算機終端生產廠家共同制定的用於串行通訊的標准RS是一個全雙工的通訊協議它可以同時進行數據接收和發送的工作RS的端口通常有兩種針(DB)和針(DB)
  
  DB和DB的常用針腳定義
  
 

  

  
  常見的邊線方式
  常見的通訊方式是三線式這種方式是將兩個RS設備的發送端(TXD)和接收端(RXD)及接地端(GND)互相連接也是許多讀者所知道的連接方式
  

  

  
  這種方式分別將兩端的RS接口的()()針腳連接起來其中是數據接收線(RXD)是數據發送線(TXD)()是接地(RND)如果有一台式PC和一部NoteBook電腦就可以用這種方式連線了用三線式可以將大多數的RS設備連接起來但如果你認死了()()對接這個理會發現在連某些RS設備時並不奏效這是因為有些設備在電路內部已將線調換過來了你只要()針一一對應就行了
  
  小技巧如何辨別TXD和RXD端口?
  搞電子的人手邊應該常備一個電表用來測測電壓電阻什麼的會很有用你只要分別測一下RS端口的針腳之間的電壓通常TXD針腳與GND之間會有~V左右的負電壓表示它是TXD針腳
  
  安裝Java Communications API
  Sun的JSE中並沒有直接提供以上提到的任何一種串行通訊協議的開發包而是以獨立的jar包形式發布在網站上(從這裡下載)即commjar稱之為Javatm Communications API它是JSE的標准擴展commjar並不是最近才有早在年時sun就已經發布了這個開發包commjar分別提供了對常用的RS串行端口和IEEE並行端口通訊的支持目前sun發布的commjar只有Windows和Solaris平台兩個版本如果你需要Linux平台下的可以在找到
  
  在使用commjar之前必須知道如何安裝它這也是困擾許多初學java RS通訊者的一個難題如果我們電腦上安裝了JDK它將同時為我們安裝一份JRE(Java Runtime Entironment)通常我們運行程序時都是以JRE來運行的所以以下的安裝適用於JRE如果你是用JDK來運行程序的請將相應的改成
  
  下載了commjar開發包後與之一起的還有兩個重要的文件wincomdll和mpropertiescommjar提供了通訊用的java API而wincomdll提供了供commjar調用的本地驅動接口而mproperties是這個驅動的類配置文件首先將commjar復制到\lib\ext目錄再將wincomdll復制到你的RS應用程序運行的目錄即userdir然後將mproperties復制到\lib目錄
  
  通訊前的准備
  如果你手頭上沒有現成的提供了標准RS串口的設備你可以將自己的電腦模擬成兩台不同的串口設備通常電腦主機後面的面板提供了兩個針的串口請將這兩個串口的腳按前面介紹的方法連接電子市場都有現成的連接頭賣請不要買那種封裝的嚴嚴實實的接頭而要買用螺絲封裝可以拆開的連接頭這樣可以方便自己根據需要連接各個針腳
  
  Comm API基礎
  我無意於在此詳細描述Comm API每個類和接口的用法但我會介紹Comm API的類結構和幾個重要的API用法
  
  所有的comm API位於m包下面從Comm API的javadoc來看它介紹給我們的只有區區以下個類或接口
  mCommDriver
  
  mCommPort
  
  mParallelPort
  
  mSerialPort
  
  mCommPortIdentifier
  
  mCommPortOwnershipListener
  
  mParallelPortEvent
  
  mSerialPortEvent
  
  mParallelPortEventListener (extends javautilEventListener)
  
  mSerialPortEventListener (extends javautilEventListener)
  
  mNoSuchPortException
  
  mPortInUseException
  
  mUnsupportedCommOperationException
  
  下面講解一下幾個主要類或接口
  
  枚舉出系統所有的RS端口
  
  在開始使用RS端口通訊之前我們想知道系統有哪些端口是可用的以下代碼列出系統中所有可用的RS端口:
  
  Enumeration en = CommPortIdentifiergetPortIdentifiers();
  
  CommPortIdentifier portId;
  
  while (enhasMoreElements())
  
  {
  
  portId = (CommPortIdentifier) ennextElement();
  
  /*如果端口類型是串口則打印出其端口信息*/
  
  if (portIdgetPortType() == CommPortIdentifierPORT_SERIAL)
  
  {
  
  Systemoutprintln(portIdgetName());
  
  }
  
  }
  
  在我的電腦上以上程序輸出以下結果
  
  COM
  
  COM
  
  CommPortIdentifier類的getPortIdentifiers方法可以找到系統所有的串口每個串口對應一個CommPortIdentifier類的實例
  
  打開端口
  
  如果你使用端口必須先打開它
  
  try{
  
  CommPort serialPort = portIdopen(My App );
  
  /*從端口中讀取數據*/
  
  InputStream input = serialPortgetInputStream();
  
  inputread();
  
  /*往端口中寫數據*/
  
  OutputStream output = serialPortgetOutputStream();
  
  outputwrite()
  
  
  
  }catch(PortInUseException ex)
  
  { }
  
  通過CommPortIdentifier的open方法可以返回一個CommPort對象open方法有兩個參數第一個是String通常設置為你的應用程序的名字第二個參數是時間即開啟端口超時的毫秒數當端口被另外的應用程序占用時將拋出PortInUseException異常
  
  在這裡CommPortIdentifier類和CommPort類有什麼區別呢?其實它們兩者是一一對應的關系CommPortIdentifier主要負責端口的初始化和開啟以及管理它們的占有權而CommPort則是跟實際的輸入和輸出功能有關的通過CommPort的getInputStream()可以取得端口的輸入流它是javaioInputStream接口的一個實例我們可以用標准的InputStream的操作接口來讀取流中的數據就像通過FileInputSteam讀取文件的內容一樣相應的CommPort的getOutputStream可以獲得端口的輸出流這樣就可以往串口輸出數據了
  
  關閉端口
  
  使用完的端口必須記得將其關閉這樣可以讓其它的程序有機會使用它不然其它程序使用該端口時可能會拋出端口正在使用中的錯誤很奇怪的是CommPortIdentifier類只提供了開啟端口的方法而要關閉端口則要調用CommPort類的close()方法CommPort的輸入流的讀取方式與文件的輸入流有些不一樣那就是你可能永遠不知這個InputStream何時結束除非對方的OutputStream向你發送了一個特定數據表示發送結束你收到這個特定字符後再行關閉你的InputStream而commjar提供了兩種靈活的方式讓你讀取數據
  
  輪詢方式(Polling)
  
  舉個例子你同GF相約一起出門去看電影但你的GF好打扮這一打扮可能就是半小時甚至一小時以上這時你就耐不住了每兩分鐘就催問一次好了沒?如此這樣直到你的GF說OK了才算完這個就叫輪詢(Polling)
  
  在程序中輪詢通常設計成一個封閉的循環當滿足某個條件時即結束循環剛才那個例子中你的GF說OK了!這個就是結束你輪詢的條件在單線程的程序中當循環一直執行某項任務而又無法預知它何時結束時此時你的程序看起來可能就像死機一樣在VB程序中這個問題可以用在循環結構中插入一個doEvent語句來解決而Java中最好的方式是使用線程就像以下代碼片斷一樣
  
  public TestPort extend Thread
  
  {
  
  
  
  InputStream input = serial
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26696.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.