這是一個通過JAVA的擴充包(javax.comm)從串口讀取值的類,本類庫(javax.comm)主要包括:
SerialBean.java (與其他應用程式的介面),
SerialBuffer.java (用來儲存從串口所接收資料的緩衝區),
ReadSerial.java (從串口讀取資料的程式)。
整個類的設計思路大概就是:
實現一個線程一直在監聽串口中是否有資料傳送過來, 如果有的話開始拍照,並取得照片後,直接列印出來。因為涉及到商業秘密,所以拍照函數和取得照片函數採用的是空函數,請見諒!
若要運行此函數必須下載該擴充包,並載入到你的CLASSPATH下。當然,你若要測試並運行此類的話。可能要花費不少的精力。
如果你只有一台機器,你可以利用一條RS-232電纜將COM1和COM2串連起來,在COM1上運行SerialExample,在COM2上運行Windows提供的超級終端程式。
如果你有兩台機器的話,你可以利用一條RS-232電纜將兩台機器的COM1(或者是COM2)串連起來,在一端運行常式,另外一端運行Windows提供的超級終端程式。
該類有相當詳細的注釋。我想應該不難理解吧
!
import java.io.*;import java.awt.*;import java.awt.print.*;import javax.print.*;import javax.comm.*; //這是一個Java擴充類庫,並不包括在標準的Java SDK當中。//如果你尚未安裝這個擴充類那麼你需要到sun公司的Java網站下載這個類庫class SuanKouimplements Runnable{ private java.io.FileOutputStream fos=null; private Thread th=null; private long shiJian=500;//設定間隔的時間 //private int duanKou=1;//設定連接埠號碼 private String Msg = null; private SerialBean SB=null; private int isSucces=-1; //建構函式 public SuanKou(long sj,int dk) { System.out.println("建構函式"); try{ fos=new java.io.FileOutputStream("c:\\log.txt"); this.shiJian=sj;//設定監聽連接埠的時間 //this.duanKou=dk;//連接埠號碼 SB = new SerialBean(dk);//建立一個介面對象,參數為連接埠號碼 isSucces = SB.Initialize();//初使化所指定的串口並返回初始化結果。如果初始化成功返回1,否則返回-1 th=new Thread(this);//建立一個線程對象 th.start();//建立SuanKou這個對象就開始啟動線程 }catch(java.io.FileNotFoundException fe){ fe.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } }//拍照函數 public void snape() { System.out.println("拍照函數"); }//取得照片函數 public void getPicture() { System.out.println("取得照片函數"); } //實現線程介面的RUN方法 public void run(){ Thread.sleep(shiJian); this.ReadSuanKou(); } //定期到串口讀取資料和函數,如果能讀到資料就調用snape(),getPicture(),函數,寫日誌,列印 private void ReadSuanKou() { //如果初使化成功的話, if (isSucces == 1) { //從串口(緩衝區)中讀取指定長度的一個字串。(500) try{ Msg = SB.ReadPort(500); //如果可以從串口讀到資料的話 if (Msg != null) { this.snape();//調用拍照函數 this.getPicture();//調用取得照片函數 java.text.SimpleDateFormat df=newjava.text.SimpleDateFormat("EEEE-MMMM-dd-yyyy"); Date date=new Date(); String dateFormat=df.format(date); fos.write(dateFormat.getBytes());//在記錄檔中記錄目前時間 fos.write(Msg.getBytes());//將讀到的資料寫到記錄檔中 //調用列印方法註:若要列印,要列印的對象必須實現java.awt.print.Printable介面。即getPicture //返回的對象必須實現該介面,因為不知道getPicture返回什麼對象,故這個列印功能無法實現,不過大概的思路是 /** 1,需要一個列印服務物件。這可通過三種方式實現: 在jdk1.4之前的版本,必須要實現java.awt.print.Printable介面 或通過Toolkit.getDefaultToolkit().getPrintJob來擷取列印服務物件; 在jdk1.4中則還可以通過javax.print.PrintSerivceLookup來尋找定位一個列印服務物件。2、需要開始一個列印工作。這也有幾種實現方法:在jdk1.4之前可以通過java.awt.print.PrintJob(jdk1.1提供的,現在已經很少用了)調用print或printAll方法開始列印工作; 也可以通過java.awt.print.PrinterJob的printDialog顯示列印對話方塊,然後通過print方法開始列印;在jdk1.4中則可以通過javax.print.ServiceUI的printDialog顯示列印對話方塊,然後調用print方法開始一個列印工作。 根據以上的提示去做,不會很難! */ java.awt.print.PrinterJob pj=new java.awt.print.PrinterJob(); pj.printDialog();//顯示列印對話方塊 pj.print();//開始列印 } //SB.WritePort("OK");若要向串口返回一個結果可以調用該函數? }catch(Exception e){ e.printStackTrace(); }finally{ try{ fos.close(); //停止串口檢測進程並關閉串口。 SB.ClosePort(); }catch(Exception e){ e.printStackTrace(); } } } else { throw RuntimeException("讀取串口資料時出錯!"); }} //主函數 public static void main(String args[]) { new SuanKou(1000,1);//參數為間隔的時間,和連接埠號碼 }}