ホームページ  >  記事  >  Java  >  Java のシリアル通信の簡単な紹介

Java のシリアル通信の簡単な紹介

高洛峰
高洛峰オリジナル
2016-12-19 17:02:561893ブラウズ

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 サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。