Java シリアル通信の概要、組み込みシステムやセンサー ネットワークの多くのアプリケーションやテストでは、PC を介した組み込みデバイスやセンサー ノードとの通信が必要です。その中で、最も一般的に使用されるインターフェイスは、RS-232 シリアル ポートとパラレル ポートです (USB インターフェイスの複雑さと大量のデータ転送を必要としないという事実を考慮すると、USB インターフェイスはまだ贅沢すぎて使用できません)さらに、現在、SUN に加えて、USB を直接サポートする Java ライブラリは他にありません。
SUN の CommAPI は、一般的に使用される RS232 シリアル ポート通信と IEEE1284 パラレル ポート通信をそれぞれサポートします。 RS-232-C (EIA RS-232-C としても知られ、以下 RS232 と呼びます) は、電子工業会 (EIA) が Bell Systems、モデム メーカー、およびシリアル通信用のコンピュータ端末メーカーと共同で 1970 年に開発しました。規格。 RS232 は、データの送受信を同時に行うことができる全二重通信プロトコルです。
1 共通 Java シリアル ポート パッケージ
現在、一般的な Java シリアル ポート パッケージには、1998 年に SUN によってリリースされたシリアル ポート通信 API が含まれています。 IBM シリアル通信 API とオープンソース実装。 SUN の API は Windows 上で一般的に使用されており、IBM の実装は SUN と API レベルで同じであるため、オープンソースの実装は 2 つの大手メーカーの製品ほど安心できません。ここでは、SUN のシリアル ポート API の使用方法のみを紹介します。 Windows プラットフォーム。
その指示 (Readme.html) によると、シリアル通信にシリアル ポート パッケージを使用する場合は、環境変数の設定に加えて、win32com.dll を bin ディレクトリにコピーする必要があります。 lib ;javax.comm.properties も lib ディレクトリにコピーします。ただし、実際にシリアル ポート パッケージを実行して使用する場合、これらを実行するだけでは十分ではありません。
通常、「java MyApp」を実行すると、MyApp は JRE 下の仮想マシンによって起動されるためです。上記のファイルを JDK の対応するディレクトリにコピーするだけなので、アプリケーションはシリアル ポートが見つからないというメッセージを表示します。この問題の解決策は非常に簡単で、上記のファイルを JRE の対応するディレクトリに配置するだけです。
ネットワーク アプリケーションでシリアル ポート API を使用すると、他のより複雑な問題が発生することに注意してください。ご興味がございましたら、CSDN コミュニティの投稿「javacomm20 を使用して Web ページ上のクライアント シリアル ポートを読み取るアプレットの問題について」をご覧ください。
2 シリアル ポート API の概要
2.1 javax.comm.CommPort
これは、基礎となるシステムによってサポートされるポートを記述するために使用される抽象クラスです。これには、すべての異なる通信ポートに共通するいくつかの高レベル IO 制御メソッドが含まれています。 SerialPort と ParallelPort はどちらもそのサブクラスであり、前者はシリアル ポートの制御に使用され、後者はパラレル ポートの制御に使用されます。両方とも、基礎となる物理ポートの制御方法が異なります。ここでは SerialPort のみに注目します。
2.2 javax.comm.CommPortIdentifier
このクラスは主にシリアルポートの管理と設定に使用され、シリアルポートのアクセス制御のためのコアクラスです。主に以下のメソッドが含まれます
利用可能な通信ポートがあるかどうかを判断する
IO操作のために通信ポートを開く
ポートの所有権を決定する
ポートの所有権の競合を処理する
ポートの所有権の変更によって引き起こされるイベントを管理する
2.3 javax.comm.SerialPort
このクラスは、RS-232 シリアル通信ポートの基礎となるインターフェイスを記述するために使用され、シリアル通信に必要な最小限の関数セットを定義します。これを通じて、ユーザーはシリアル ポートの読み取り、書き込み、設定を直接行うことができます。
2.4 シリアル ポート API の例
長い文章は、小さな例ほど明確にすることはできません。シリアル ポート パッケージに付属するサンプルを見てみましょう。SerialDemo の小さなコードで、理解を深めます。シリアル ポート API コア クラスの使用方法についての知識。
2.4.1 このマシンで使用可能なすべてのシリアル ポートを一覧表示します
void listPortChoices() { CommPortIdentifier portId; Enumeration en = CommPortIdentifier.getPortIdentifiers(); // iterate through the ports. while (en.hasMoreElements()) { portId = (CommPortIdentifier) en.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { System.out.println(portId.getName()); } } portChoice.select(parameters.getPortName()); }
上記のコードは、現在のシステムで使用可能なすべてのシリアル ポート名を一覧表示できます。私のマシンでの出力結果は COM1 と COM3 です。
2.4.2 シリアルポートパラメータの設定
シリアルポートには通常、シリアルポートを開く前に設定できる次のパラメータがあります: ボーレート、入出力フロー制御、データビット数、ストップビット、パリティなど。
SerialPort sPort; try { sPort.setSerialPortParams(BaudRate,Databits,Stopbits,Parity); //设置输入/输出控制流 sPort.setFlowControlMode(FlowControlIn | FlowControlOut); } catch (UnsupportedCommOperationException e) {}
2.4.3 シリアルポートの読み取りと書き込み
シリアルポートの読み取りと書き込みを行う前に、シリアルポートを開く必要があります:
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(PortName); try { SerialPort sPort = (SerialPort) portId.open("串口所有者名称", 超时等待时间); } catch (PortInUseException e) {//如果端口被占用就抛出这个异常 throw new SerialConnectionException(e.getMessage()); } //用于对串口写数据 OutputStream os = new BufferedOutputStream(sPort.getOutputStream()); os.write(int data); //用于从串口读数据 InputStream is = new BufferedInputStream(sPort.getInputStream()); int receivedData = is.read();
読み出しは int 型で、必要に応じて他の型に変換できます。
ここで注意すべき点は、Java 言語には符号なし型がない、つまりすべての型が符号付きであるため、byte から int に変換するときに特別な注意を払う必要があるということです。バイトの最上位ビットが 1 の場合、int 型に変換するときに 1 がプレースホルダーとして使用されるためです。このように、元のバイト型番号 10000000 は int 型になり、1111111110000000 になります。これは非常に深刻な問題であり、回避する必要があります。
3 シリアル ポート通信の一般的なモードと問題点
ようやく私が最も嫌いな基礎知識の話が終わりました。今回は、シリアル ポート アプリケーションの研究に焦点を当ててみましょう。シリアル ポートへのデータの書き込みは非常に簡単なので、ここではシリアル ポートからのデータの読み取りだけに焦点を当てます。
通常、シリアル通信アプリケーションには 2 つのモードがあります。1 つは、SerialPortEventListener インターフェイスを実装して、さまざまなシリアル ポート イベントを監視し、それに応じて処理することです。もう 1 つは、特にデータの受信を担当する独立した受信スレッドを確立することです。これら 2 つの方法は場合によっては重大な問題を抱えているため (問題については、今はオープンのままにしておきます)、私の実装では、この問題を解決するために 3 番目の方法を使用します。
Java のシリアル通信の簡単な入門に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。