一個Java讀取串口值的類

來源:互聯網
上載者:User

 

這是一個通過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);//參數為間隔的時間,和連接埠號碼  }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.