トップページ > dsPIC入門 > Javaでハイパーターミナル(9)
いよいよシリアル通信用のクラスです。ここまでの内容はフレームとか、テキストエリアとか、ボタンとか
…なんというか、「ただの外枠」という感じでした。(外枠が便利だからGUIプログラムの価値がある
とも言えるのですが・・・)
ここからの流れは、最初に、今後もいろいろ使いまわせるような汎用シリアル通信クラスをつくってしまいます。
次に、その汎用シリアルクラス継承して今回のアプリケーションに
合ったシリアル通信担当のクラスにします。最後にいろいろイベントを付け加えたりして完成…という感じです。
今回もシリアル通信用のライブラリである“RXTXライブラリ”にお世話になります。本家Sun社の “Communications API”というのがあるのですが、なぜかWindows版だけ無いのでこのRXTXライブラリを使おう… ということでした。もしインストールしていない場合はシリアル通信のところを 参照してインストールを済ませてください。
CommPortIdentifierクラスはハードウェア寄りな処理を担当する感じです。シリアルポートを確保したり、 他のプログラムがそのCOMポートを使用しているかなどの情報を扱います。以下、 このCommPortIdentifierクラスのメソッドの中でも必ず使いそうなものを紹介します。
getPortIdentifier(String comName)引数のとして取ったポート名のCOMポートを取得します。
isCurrentlyOwned()現在取得中のポートが開いているかどうかをチェックするためのメソッドです。trueかfalseが返されます。
open(String owner,int tiemOut)取得したポートを開くメソッドです。引数はポートを開いたアプリケーション名と、タイムアウト時間です。 引数は結構テキトーでも可です…。
SerialPortクラスはハードウエア的に確保されたCOMポートに対して、通信用のパラメータを設定したり 入出力ストリームの管理などを行います。やや上層に位置するクラスという感じでしょうか…。 初期化の際には、上のCommPortIdentifierクラスのopenメソッドで返されるComPortオブジェクトを入れます。 以下、このSerialPortクラスのメソッドの中でも必ず使いそうなものを紹介します。
setSerialPortParams(int baudRate,int dataBit,int stopBit,int parity)ポートを開いた後に、このメソッドを使って通信速度やデータビット数、ストップビット数、パリティの有無を 設定します。
setFlowControlMode(int flowControl)フロー制御の有無を設定するためのメソッドです。
getInputStream()入力用のストリームを作成する際に、シリアル通信クラスからストリームを返してくれます。
getOutputStream()出力用のストリームを作成する際に、シリアル通信クラスからストリームを返してくれます。
今回は基本的な機能に絞ります。
…という3つのメソッドを実装することにします。受信用のメソッドは受信割り込み…というか、 イベントリスナと対応したイベント処理メソッドとなるので、これは今回作るクラスを継承する側で 定義するものとします。
クラスのフィールドは、以下の通りとします。
シリアル通信を利用するためのクラス大枠としては、こんな感じです…
class Serial_Base { //============================================================================= //クラスのフィールド SerialPort port; CommPortIdentifier comID; String comName; int baudRate; InputStream in; OutputStream out; //============================================================================= //開くメソッド Serial_open() //============================================================================= //閉じるメソッド Serial_close() //============================================================================= //文字列送信メソッド Serial_puts() }
指定されたCOMポートを開くメソッドです。また、ボー・レートも引数として取ります。 ポートが正常に開けなかった場合はメッセージボックスを表示し、falseを返します。
//============================================================================= //ポートオープンの関数 boolean Serial_open(String Com_Name,int Baud_Rate) { //受け取った引数を自分のフィールドにも反映させておきます。 comName = Com_Name; baudRate = Baud_Rate; //---------------------------------------------------------------------------- //ポートIDを取得 try { //フィールドのcomNameの名前で新規にCOMポートを取得 comID = CommPortIdentifier.getPortIdentifier(comName); } catch(Exception e1) { JOptionPane.showMessageDialog(null,"ポートを取得できませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } //---------------------------------------------------------------------------- //もしポートがまだ開いていないなら、ポートを開いて各種設定を行います。 if(comID.isCurrentlyOwned()==false) { try { //シリアルポートのインスタンスを生成 port = (SerialPort)comID.open("serial_canvas",2000); //ボーレート、データビット数、ストップビット数、パリティを設定 port.setSerialPortParams(baudRate,SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE ); //フロー制御はしない port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); //入出力ストリームの設定 in = port.getInputStream(); out = port.getOutputStream(); } catch(Exception e2) { JOptionPane.showMessageDialog(null,"うまく開けませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } } //---------------------------------------------------------------------------- //ポートが既に開いている場合は、メッセージボックスを表示し、falseを返します。 else { JOptionPane.showMessageDialog(null,"すでに開いています。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } //正常終了ならtrueを返します。 return true; }
現在開いているポートを閉じるメソッドです。また、入出力ストリームも閉じます。 正常に閉じることができればtrueを、既に閉じていたり何らかのエラーがあった場合は メッセージボックスを表示してfalseを返します。
//============================================================================= //ポートクローズの関数 boolean Serial_close() { //---------------------------------------------------------------------------- //もしポートが開いていれば、閉じる処理を行います。 if(comID.isCurrentlyOwned()) { try { //全部クローズ。 port.close(); in.close(); out.close(); } catch(IOException e3) { JOptionPane.showMessageDialog(null,"うまく閉じれませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } } //---------------------------------------------------------------------------- //もしポートが既に閉じているなら、メッセージボックスを表示してfalseを返します。 else { JOptionPane.showMessageDialog(null,"すでに閉じています。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } //正常終了ならtrueを返します。 return true; }
引数として受け取った文字列を出力ストリームを介して送信するメソッドです。
//============================================================================= //文字列送信関数 void Serial_puts(String str) { try { //String型の引数をbyte配列にする。 byte[] data = str.getBytes(); //アウトプットストリームを介して送信します。 out.write(data); out.flush(); } catch(Exception e4) { } }
ファイル名は“Serial_Base.java”としておきます。
//**************************************************************************************** //汎用シリアル通信クラス //**************************************************************************************** import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.io.*; import gnu.io.*; class Serial_Base { //============================================================================= //クラスのフィールド SerialPort port; CommPortIdentifier comID; String comName; int baudRate; InputStream in; OutputStream out; //============================================================================= //ポートオープンの関数 boolean Serial_open(String Com_Name,int Baud_Rate) { //受け取った引数を自分のフィールドにも反映させておきます。 comName = Com_Name; baudRate = Baud_Rate; //---------------------------------------------------------------------------- //ポートIDを取得 try { //フィールドのcomNameの名前で新規にCOMポートを取得 comID = CommPortIdentifier.getPortIdentifier(comName); } catch(Exception e1) { JOptionPane.showMessageDialog(null,"ポートを取得できませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } //---------------------------------------------------------------------------- //もしポートが既に開いていないなら、ポートを開いて各種設定を行います。 if(comID.isCurrentlyOwned()==false) { try { //シリアルポートのインスタンスを生成 port = (SerialPort)comID.open("serial_canvas",2000); //ボーレート、データビット数、ストップビット数、パリティを設定 port.setSerialPortParams(baudRate,SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE ); //フロー制御はしない port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); //入出力ストリームの設定 in = port.getInputStream(); out = port.getOutputStream(); } catch(Exception e2) { JOptionPane.showMessageDialog(null,"うまく開けませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } } else { JOptionPane.showMessageDialog(null,"すでに開いています。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } //正常終了ならtrueを返します。 return true; } //============================================================================= //ポートクローズの関数 boolean Serial_close() { if(comID.isCurrentlyOwned()) { try { //全部クローズ。 port.close(); in.close(); out.close(); } catch(IOException e3) { JOptionPane.showMessageDialog(null,"うまく閉じれませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } } else { JOptionPane.showMessageDialog(null,"すでに閉じています。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE); return false; } //正常終了ならtrueを返します。 return true; } //============================================================================= //文字列送信関数 void Serial_puts(String str) { try { //String型の引数をbyte配列にする。 byte[] data = str.getBytes(); //アウトプットストリームを介して送信します。 out.write(data); out.flush(); } catch(Exception e4) { } } }