Java のシリアル通信の簡単な紹介
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 サイトに注目してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この記事では、2025年の上位4つのJavaScriptフレームワーク(React、Angular、Vue、Svelte)を分析し、パフォーマンス、スケーラビリティ、将来の見通しを比較します。 強力なコミュニティと生態系のためにすべてが支配的なままですが、彼らの相対的なポップ

この記事では、リモートコードの実行を可能にする重大な欠陥であるSnakeyamlのCVE-2022-1471の脆弱性について説明します。 Snakeyaml 1.33以降のSpring Bootアプリケーションをアップグレードする方法は、このリスクを軽減する方法を詳述し、その依存関係のアップデートを強調しています

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

大規模な分析データセットのオープンテーブル形式であるIcebergは、データの湖のパフォーマンスとスケーラビリティを向上させます。 内部メタデータ管理を通じて、寄木細工/ORCの制限に対処し、効率的なスキーマの進化、タイムトラベル、同時wを可能にします

node.js 20は、V8エンジンの改善、特により速いガベージコレクションとI/Oを介してパフォーマンスを大幅に向上させます。 新機能には、より良いWebセンブリのサポートと洗練されたデバッグツール、開発者の生産性とアプリケーション速度の向上が含まれます。

この記事では、キュウリの手順間でデータを共有する方法、シナリオコンテキスト、グローバル変数、引数の合格、およびデータ構造を比較する方法を調べます。 簡潔なコンテキストの使用、記述など、保守性のためのベストプラクティスを強調しています

この記事では、Lambda式、Streams API、メソッド参照、およびオプションを使用して、機能プログラミングをJavaに統合することを調べます。 それは、簡潔さと不変性を通じてコードの読みやすさと保守性の改善などの利点を強調しています
