<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 閱讀(5830) 評(píng)論(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í)候
    你會(huì)找不到串口。
    正確安裝Java Communication API并將上述程序編譯通過以后,
    你可以按如下方法測試這個(gè)程序。如果你只有一臺(tái)機(jī)器,你可以利用一條
    RS-232電纜將COM1和COM2連接起來,在COM1上運(yùn)行SerialExample,
    在COM2上運(yùn)行Windows提供的超級(jí)終端程序。如果你有兩臺(tái)機(jī)器的話,
    你可以利用一條RS-232電纜將兩臺(tái)機(jī)器的COM1(或者是COM2)連接起來,在一端運(yùn)行例程,
    另外一端運(yùn)行Windows提供的超級(jí)終端程序。如果有必要的話,可以對SerialExample中
    所聲明的串口進(jìn)行相應(yīng)改動(dòng)。
    本程序在Windows 2000 + Java SDK 1.3環(huán)境下編譯通過并成功運(yùn)行。

    評(píng)論

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

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

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

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

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

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

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

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

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

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

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

    2008-05-14 10:59 by tt
    Eclipse 下也可直接使用,寫的很好
    主站蜘蛛池模板: 亚洲熟妇AV一区二区三区浪潮| 一级特黄aaa大片免费看| 国产免费观看黄AV片| 精品一区二区三区免费观看| 亚洲国产人成在线观看69网站 | 亚洲国产精品无码一线岛国| 久久A级毛片免费观看| 亚洲heyzo专区无码综合| 亚洲午夜久久久久妓女影院| 久热中文字幕在线精品免费| 思思久久99热免费精品6| 亚洲欧洲日产国码www| 国产成人精品久久亚洲| 国产人在线成免费视频| 一级毛片视频免费| 亚洲综合色7777情网站777| 亚洲熟女少妇一区二区| 在线a人片天堂免费观看高清| 嫩草在线视频www免费看| 亚洲日韩av无码中文| 亚洲AV无码成人专区片在线观看| 女人张开腿等男人桶免费视频 | 嫩草影院免费观看| 午夜精品一区二区三区免费视频| 国产亚洲欧美在线观看| 91亚洲一区二区在线观看不卡 | 妞干网手机免费视频| 未满十八18禁止免费无码网站 | 丁香婷婷亚洲六月综合色| 日韩精品亚洲aⅴ在线影院| 德国女人一级毛片免费| 四虎免费影院ww4164h| 中国极品美軳免费观看| 国产综合成人亚洲区| xxx毛茸茸的亚洲| 亚洲天天做日日做天天欢毛片| 日韩精品亚洲aⅴ在线影院| 国产乱子伦精品免费女| 免费黄色一级毛片| 最新欧洲大片免费在线| 一区二区三区四区免费视频|