<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    FORTUNE

    THE WAY TO THE MASTER...
    posts - 49, comments - 18, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    java串口編程(起步

    Posted on 2006-03-03 11:00 fortune 閱讀(5829) 評論(6)  編輯  收藏 所屬分類: java技術(shù)
    1. SerialBean
    SerialBean是本類庫與其他應(yīng)用程序的接口。該類庫中定義了SerialBean的構(gòu)造方法以及初始化串口,從串口讀取數(shù)據(jù),往串口寫入數(shù)據(jù)以及關(guān)閉串口的函數(shù)。具體介紹如下:

    public SerialBean(int PortID)
    本函數(shù)構(gòu)造一個(gè)指向特定串口的SerialBean,該串口由參數(shù)PortID所指定。PortID = 1 表示COM1,PortID = 2 表示COM2,由此類推。

    public int Initialize()
    本函數(shù)初始化所指定的串口并返回初始化結(jié)果。如果初始化成功返回1,否則返回-1。初始化的結(jié)果是該串口被SerialBean獨(dú)占性使用,其參數(shù)被設(shè)置為9600, N, 8, 1。如果串口被成功初始化,則打開一個(gè)進(jìn)程讀取從串口傳入的數(shù)據(jù)并將其保存在緩沖區(qū)中。

    public String ReadPort(int Length)
    本函數(shù)從串口(緩沖區(qū))中讀取指定長度的一個(gè)字符串。參數(shù)Length指定所返回字符串的長度。

    public void WritePort(String Msg)
    本函數(shù)向串口發(fā)送一個(gè)字符串。參數(shù)Msg是需要發(fā)送的字符串。

    public void ClosePort()
    本函數(shù)停止串口檢測進(jìn)程并關(guān)閉串口。
    package serial;
     import java.io.*;
     import java.util.*;
     import javax.comm.*;
     /**
      *
      * This bean provides some basic functions to implement full dulplex
      * information exchange through the srial port.
      *
      */
     public class SerialBean
     {
       static String PortName;
       CommPortIdentifier portId;
       SerialPort serialPort;
       static OutputStream out;
       static InputStream  in;
       SerialBuffer SB;
       ReadSerial   RT;
         /**
          *
          * Constructor
          *
          * @param PortID the ID of the serial to be used. 1 for COM1,
          * 2 for COM2, etc.
          *
          */
         public SerialBean(int PortID)
         {
           PortName = "COM" + PortID;
         }
         /**
          *
          * This function initialize the serial port for communication. It startss a
          * thread which consistently monitors the serial port. Any signal capturred
          * from the serial port is stored into a buffer area.
          *
          */
         public int Initialize()
         {
           int InitSuccess = 1;
           int InitFail    = -1;
         try
         {
           portId = CommPortIdentifier.getPortIdentifier(PortName);
           try
           {
             serialPort = (SerialPort)
             portId.open("Serial_Communication", 2000);
           } catch (PortInUseException e)
           {
             return InitFail;
           }
           //Use InputStream in to read from the serial port, and OutputStream
           //out to write to the serial port.
           try
           {
             in  = serialPort.getInputStream();
             out = serialPort.getOutputStream();
           } catch (IOException e)
           {
             return InitFail;
           }
           //Initialize the communication parameters to 9600, 8, 1, none.
           try
           {
              serialPort.setSerialPortParams(9600,
                   SerialPort.DATABITS_8,
                   SerialPort.STOPBITS_1,
                   SerialPort.PARITY_NONE);
           } catch (UnsupportedCommOperationException e)
           {
             return InitFail;
           }
         } catch (NoSuchPortException e)
         {
           return InitFail;
         }
         // when successfully open the serial port,  create a new serial buffer,
         // then create a thread that consistently accepts incoming signals from
         // the serial port. Incoming signals are stored in the serial buffer.
         SB = new SerialBuffer();
         RT = new ReadSerial(SB, in);
         RT.start();
         // return success information
         return InitSuccess;
         }
         /**
          *
          * This function returns a string with a certain length from the incomin
          * messages.
          *
          * @param Length The length of the string to be returned.
          *
          */
         public String ReadPort(int Length)
         {
           String Msg;
           Msg = SB.GetMsg(Length);
           return Msg;
         }
         /**
          *
          * This function sends a message through the serial port.
          *
          * @param Msg The string to be sent.
          *
          */
         public void WritePort(String Msg)
         {
           int c;
           try
           {
             for (int i = 0; i < Msg.length(); i++)
               out.write(Msg.charAt(i));
           } catch (IOException e)  {}
         }
         /**
          *
          * This function closes the serial port in use.
          *
          */
         public void ClosePort()
         {
           RT.stop();
           serialPort.close();
         }
     }
    2. SerialBuffer

    SerialBuffer是本類庫中所定義的串口緩沖區(qū),它定義了往該緩沖區(qū)中寫入數(shù)據(jù)和從該緩沖區(qū)中讀取數(shù)據(jù)所需要的函數(shù)。

    public synchronized String GetMsg(int Length)
    本函數(shù)從串口(緩沖區(qū))中讀取指定長度的一個(gè)字符串。參數(shù)Length指定所返回字符串的長度。

    public synchronized void PutChar(int c)
    本函數(shù)望串口緩沖區(qū)中寫入一個(gè)字符,參數(shù)c 是需要寫入的字符。

    在往緩沖區(qū)寫入數(shù)據(jù)或者是從緩沖區(qū)讀取數(shù)據(jù)的時(shí)候,必須保證數(shù)據(jù)的同步,因此GetMsg和PutChar函數(shù)均被聲明為synchronized并在具體實(shí)現(xiàn)中采取措施實(shí)現(xiàn)的數(shù)據(jù)的同步。
    package serial;
     /**
      *
      * This class implements the buffer area to store incoming data from the serial
      * port.
      *
      */
     public class SerialBuffer
     {
       private String Content = "";
       private String CurrentMsg, TempContent;
       private boolean available = false;
       private int LengthNeeded = 1;
         /**
          *
          * This function returns a string with a certain length from the incomin
          * messages.
          *
          * @param Length The length of the string to be returned.
          *
          */
       public synchronized String GetMsg(int Length)
       {
         LengthNeeded = Length;
         notifyAll();
         if (LengthNeeded > Content.length())
         {
           available = false;
           while (available == false)
           {
             try
             {
               wait();
             } catch (InterruptedException e) { }
           }
         }
         CurrentMsg  = Content.substring(0, LengthNeeded);
         TempContent = Content.substring(LengthNeeded);
         Content = TempContent;
         LengthNeeded = 1;
         notifyAll();
         return CurrentMsg;
       }
         /**
          *
          * This function stores a character captured from the serial port to the
          * buffer area.
          *
          * @param t The char value of the character to be stored.
          *
          */
       public synchronized void PutChar(int c)
       {
         Character d = new Character((char) c);
         Content = Content.concat(d.toString());
         if (LengthNeeded < Content.length())
         {
           available = true;
         }
         notifyAll();
       }
     }
       3. ReadSerial
    ReadSerial是一個(gè)進(jìn)程,它不斷的從指定的串口讀取數(shù)據(jù)并將其存放到緩沖區(qū)中。

    public ReadSerial(SerialBuffer SB, InputStream Port)
    本函數(shù)構(gòu)造一個(gè)ReadSerial進(jìn)程,參數(shù)SB指定存放傳入數(shù)據(jù)的緩沖區(qū),參數(shù)Port指定從串口所接收的數(shù)據(jù)流。

    public void run()
    ReadSerial進(jìn)程的主函數(shù),它不斷的從指定的串口讀取數(shù)據(jù)并將其存放到緩沖區(qū)中。
    package serial;
     import java.io.*;
     /**
      *
      * This class reads message from the specific serial port and save
      * the message to the serial buffer.
      *
      */
     public class ReadSerial extends Thread
     {
       private SerialBuffer ComBuffer;
       private InputStream ComPort;
         /**
          *
          * Constructor
          *
          * @param SB The buffer to save the incoming messages.
          * @param Port The InputStream from the specific serial port.
          *
          */
       public ReadSerial(SerialBuffer SB, InputStream Port)
       {
         ComBuffer = SB;
         ComPort = Port;
       }
       public void run()
       {
         int c;
         try
         {
           while (true)
           {
             c = ComPort.read();
             ComBuffer.PutChar(c);
           }
         } catch (IOException e) {}
       }
     }
    4. SerialExample
    SerialExample是本類庫所提供的一個(gè)例程。它所實(shí)現(xiàn)的功能是打開串口COM1,
    對其進(jìn)行初始化,從串口讀取信息對其進(jìn)行處理后將處理結(jié)果發(fā)送到串口。
    import serial.*;
     import java.io.*;
     /**
      *
      * This is an example of how to use the SerialBean. It opens COM1 and reads
      * six messages with different length form the serial port.
      *
      */
     class SerialExample
     {
       public static void main(String[] args)
       {
         //TO DO: Add your JAVA codes here
         SerialBean SB = new SerialBean(1);
         String Msg;
         SB.Initialize();
         for (int i = 5; i <= 10; i++)
         {
           Msg = SB.ReadPort(i);
           SB.WritePort("Reply: " + Msg);
         }
         SB.ClosePort();
       }
     }
     本類庫中使用了Java Communication API (javax.comm)。這是一個(gè)Java擴(kuò)展類庫,
    并不包括在標(biāo)準(zhǔn)的Java SDK當(dāng)中。如果你尚未安裝這個(gè)擴(kuò)展類庫的話,你應(yīng)該從
    Sun公司的Java站點(diǎn)下載這個(gè)類庫并將其安裝在你的系統(tǒng)上。在所下載的包里面包括
    一個(gè)安裝說明,如果你沒有正確安裝這個(gè)類庫及其運(yùn)行環(huán)境的話,運(yùn)行這個(gè)程序的時(shí)候
    你會找不到串口。
    正確安裝Java Communication API并將上述程序編譯通過以后,
    你可以按如下方法測試這個(gè)程序。如果你只有一臺機(jī)器,你可以利用一條
    RS-232電纜將COM1和COM2連接起來,在COM1上運(yùn)行SerialExample,
    在COM2上運(yùn)行Windows提供的超級終端程序。如果你有兩臺機(jī)器的話,
    你可以利用一條RS-232電纜將兩臺機(jī)器的COM1(或者是COM2)連接起來,在一端運(yùn)行例程,
    另外一端運(yùn)行Windows提供的超級終端程序。如果有必要的話,可以對SerialExample中
    所聲明的串口進(jìn)行相應(yīng)改動。
    本程序在Windows 2000 + Java SDK 1.3環(huán)境下編譯通過并成功運(yùn)行。

    評論

    # re: java串口編程(起步  回復(fù)  更多評論   

    2006-11-28 15:58 by pc1ibm@yahoo.com.cn
    我拷貝了上面的代碼,作了一點(diǎn)修改。編譯通過。但,運(yùn)行時(shí)拋出NoSuchMethod 異常。請執(zhí)教。

    # re: java串口編程(起步  回復(fù)  更多評論   

    2007-10-18 10:23 by fenix
    直接拷貝上述代碼可用。試過了。

    # re: java串口編程(起步[未登錄]  回復(fù)  更多評論   

    2007-11-22 13:45 by robin
    請把整個(gè)批project的代碼貼出來好嗎?我試過了怎么不行啊,我在Eclipse里面試的。

    # re: java串口編程(起步[未登錄]  回復(fù)  更多評論   

    2008-03-05 16:43 by Felix
    我的臺機(jī)和筆記本都沒有rs232口,郁悶,我用兩個(gè)usb 轉(zhuǎn) rs232 實(shí)現(xiàn)的連接.

    # re: java串口編程(起步  回復(fù)  更多評論   

    2008-04-17 14:58 by 加超
    文章寫的相當(dāng)非常很棒,值得借鑒與學(xué)習(xí),文章作者真是高手啊。。。

    # re: java串口編程(起步  回復(fù)  更多評論   

    2008-05-14 10:59 by tt
    Eclipse 下也可直接使用,寫的很好
    主站蜘蛛池模板: 久操视频在线免费观看| 99久久99这里只有免费费精品| 亚洲成色www久久网站夜月| 国产h肉在线视频免费观看| 久久精品国产亚洲AV天海翼| 国产亚洲精品拍拍拍拍拍| 最近中文字幕免费完整| 青青青亚洲精品国产| 亚洲av综合avav中文| 精品国产麻豆免费网站| 怡红院免费全部视频在线视频| 亚洲一级视频在线观看| 免费在线看片网站| 在线观看成人免费视频不卡| 日本激情猛烈在线看免费观看 | 久久av无码专区亚洲av桃花岛| 美女黄网站人色视频免费国产| 国产免费爽爽视频在线观看| 亚洲国产精品无码久久九九大片| 亚洲国产精品无码久久SM| 永久久久免费浮力影院| 美女在线视频观看影院免费天天看 | 亚洲精品无码少妇30P| 国产∨亚洲V天堂无码久久久| 国产免费av片在线无码免费看| 久久久免费精品re6| 无码 免费 国产在线观看91| 亚洲一区二区影视| 亚洲av永久无码精品秋霞电影影院 | 久久精品国产亚洲AV香蕉| 久久伊人亚洲AV无码网站| 午夜电影免费观看| 国产成人精品免费视频大| 两个人日本免费完整版在线观看1| 亚洲成a人片在线不卡一二三区| 亚洲综合精品香蕉久久网97| 亚洲国产一成久久精品国产成人综合 | 最近中文字幕国语免费完整| 亚欧国产一级在线免费| 亚洲精彩视频在线观看| 亚洲国产精品无码久久九九|