創造と開発ノート
JavaCommAPI
最終更新:
匿名ユーザー
-
view
Java Communication API
Javaからシリアル・パラレルポートを制御するためのAPI。ネイティブメソッドを使用している。
Javadoc
http://java.sun.com/products/javacomm/javadocs/javax/comm/package-summary.html
※なぜかNon-Frameバージョンしかない。
http://java.sun.com/products/javacomm/javadocs/javax/comm/package-summary.html
※なぜかNon-Frameバージョンしかない。
なお、3rd Partyではあるが、
RXTXはJava CommAPI互換の上にI2C、RS485にも対応した実装を行っている。また対応するOSもWin32、Linux、Macと主要なものを網羅している。
パッケージ名が違うので注意。
RXTXはJava CommAPI互換の上にI2C、RS485にも対応した実装を行っている。また対応するOSもWin32、Linux、Macと主要なものを網羅している。
パッケージ名が違うので注意。
バージョン
最新版は3.0Update1(2006年3月現在)。
対応するポート
現在対応しているor使用できるポートは以下の通りです。
- シリアルポート(RS-232C)
- パラレルポート
また下記はWindowsXP+ USB-シリアル変換器での動作を確認しています。
- シリアルポート(RS-422)
- シリアルポート(RS-485)
RS-422,485においてもCommAPIの使用方法はRS-232Cとまったく同じです。
対応するOS
Windows
Sunがサポートしている。
※2005年11月15日現在ダウンロードできなくなっている。バイナリの機能はJREに標準装備されたとの噂もあるが、真相は定かではない。現在下記の方法で使える可能性があるらしいが、現在検討中。
- Java Comm APIのlinux版をSunのサイトからダウンロード
- jre/libにjavax.comm.propertiesをコピー
- jre/lib/extにcomm.jarをコピー
以上
追記(2005/11/15):やはり上記ではうまくいかないようだ。
jre/binにwin32com.dllがないから??
追記(2005/11/15):やはり上記ではうまくいかないようだ。
jre/binにwin32com.dllがないから??
また裏技的に、下記のサイト
http://www-06.ibm.com/jp/developerworks/ibm/020913/j_i-barcd.html
の最下部にある「必要なcommポート・ファイルをダウンロードしてください。」というリンクをクリックすると以前のcomm.jar,javax.comm.properties,win32com.dllをダウンロードすることが出来る。
http://www-06.ibm.com/jp/developerworks/ibm/020913/j_i-barcd.html
の最下部にある「必要なcommポート・ファイルをダウンロードしてください。」というリンクをクリックすると以前のcomm.jar,javax.comm.properties,win32com.dllをダウンロードすることが出来る。
RXTXも使用可能。
http://www.rxtx.org/
http://www.rxtx.org/
Solaris
Sunがサポートしている。
Sun Microsystems
http://java.sun.com/products/javacomm/downloads/index.html
http://java.sun.com/products/javacomm/downloads/index.html
Linux
数年前からサンが正式にサポートしている。
http://java.sun.com/products/javacomm/downloads/index.html
http://java.sun.com/products/javacomm/downloads/index.html
RXTXも使用可能。
http://www.rxtx.org/
http://www.rxtx.org/
参考 http://www.viste.com/Java/CommAPI/CommAPI.htm
http://www.viste.com/Java/CommAPI/install-japanese.html
http://www.tini.prug.or.jp/linuxinstall.html
http://www.viste.com/Java/CommAPI/install-japanese.html
http://www.tini.prug.or.jp/linuxinstall.html
IBM版もある。
IBMJava2-JAVACOMM
http://www.novell.com/products/linuxpackages/enterpriseserver/i386/ibmjava2-javacomm.html
http://www.novell.com/products/linuxpackages/enterpriseserver/i386/ibmjava2-javacomm.html
JCLという物もあったらしい。が、RXTXに吸収されているらしい。
Mac
下記を使えばいいらしいが詳細は不明。動くかどうかも不明。使った方はご一報を。
http://homepage.mac.com/pcbeard/javax.comm.MRJ/
http://homepage.mac.com/pcbeard/javax.comm.MRJ/
RXTXは使用可能。
http://www.rxtx.org/
http://www.rxtx.org/
自作
下記を使えばどんなOSにも対応可能。というか、C言語の雛形しかないので、その先は自作する必要がある。腕に自身のある人向け。
http://www.openje.org/kommapi/
http://www.openje.org/kommapi/
製品版
Serialio.com SerialPort
製品版のため有償だが、PCから組み込みまで幅広いプラットフォームをサポートしている。
https://serialio.com/products/serialport/serialport.htm
製品版のため有償だが、PCから組み込みまで幅広いプラットフォームをサポートしている。
https://serialio.com/products/serialport/serialport.htm
CommPortIdentifier
CommPortIdentifierを使うとパラレル・シリアル両ポートの高度な制御が可能となる。
具体的には
具体的には
- 名前によるポートの取得(COM1,/dev/ttyS0など)
- 使用可能なポート名のリストの取得
- オーナー名を付けたポートのオープン
- オーナー情報を利用したポートのコントロール
などなど。Serial,Pararellにとらわれず、抽象的にコントロールできる。
なお、初期化はコンストラクタではなく
CommPort port = CommPortIdentifier.getPortIdentifier("COM1");
のように行う。
使用可能なポートの取得
COM1や/dev/ttyS0などの機種やOSに依存する名前をソースコード中にハードコーディング{{fn ソース中に変更不可能な形で記述してしまうこと。特に文字列を決め打ちしてしまうことを指す場合が多い。}}するのはJavaの性質上好ましくない。
また、名前は合っていても、機種によってはそのポートは実際には存在しないことも多い。(特にノートパソコンなど)
そこでポート名を動的に取得し、GUIやコマンドラインから対話的にポートを選択するようにプログラムするのが最もスマートな方法だと言える。
使用可能なポート名を取得するには次のような方法を使う。
また、名前は合っていても、機種によってはそのポートは実際には存在しないことも多い。(特にノートパソコンなど)
そこでポート名を動的に取得し、GUIやコマンドラインから対話的にポートを選択するようにプログラムするのが最もスマートな方法だと言える。
使用可能なポート名を取得するには次のような方法を使う。
CommPortIdentifier portId; ArrayList list = new ArrayList(); Enumeration en = CommPortIdentifier.getPortIdentifiers(); while (en.hasMoreElements()) { portId = (CommPortIdentifier) en.nextElement(); list.add(portId.getName()); }
シリアルポートだけ取得する場合は
CommPortIdentifier portId; ArrayList list = new ArrayList(); Enumeration en = CommPortIdentifier.getPortIdentifiers(); while (en.hasMoreElements()) { portId = (CommPortIdentifier) en.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { list.add(portId.getName()); } }
という風に条件を付ける。
パラレルの場合はPORT_SERIALをPORT_PARALLELにする。
パラレルの場合はPORT_SERIALをPORT_PARALLELにする。
北陽電機(HOKUYO)製の測域センサURGの距離取得プログラム例
URG-X04LX(プロトコルはSCIP1.0)に対応(してるはず)。
下記の添付ファイルをダウンロードしてください。
下記の添付ファイルをダウンロードしてください。
※各自の責任において使用してください。作者は一切の責任を負いかねます。
リンク
FA のための Java プログラミング講座
http://www.javainthebox.net/JavaForFA/08-09CommAPI/No.08/commapi1.html
http://www.javainthebox.net/JavaForFA/08-09CommAPI/No.08/commapi1.html
添付ファイル