検索
ホームページJava&#&チュートリアルJavaプログラムとシリアルポート間の通信の実装とデバッグ

以下は、シリアル ポート通信部分の実装とデバッグを含む、エディターの最新プロジェクトの紹介です。

シリアル通信の原理

シリアル通信とは、シリアルポートがバイトをビットごとに送受信することを指します。バイト単位のパラレル通信よりも遅いですが、シリアル ポートは、あるワイヤでデータを送信しながら、別のワイヤでデータを受信できます。

シリアル ポートは、コンピューター上の非常に一般的なデバイス通信プロトコルです (ユニバーサル シリアルバスや USB と混同しないでください)

通常、シリアル ポートは ASCII コード文字の送信に使用されます。通信は、(1) 接地、(2) 送信、(3) 受信の 3 本のワイヤを使用して行われます。シリアル通信は非同期であるため、ポートはある回線でデータを送信しながら、別の回線でデータを受信できます。他の回線はハンドシェイクに使用されますが、必須ではありません。シリアル通信の最も重要なパラメータは、ビット レート、データ ビット、ストップ ビット、パリティです。 2 つのポートが通信するには、これらのパラメーターが一致する必要があります

RS-232 (ANSI/EIA-232 標準) は IBM-PC およびその互換マシンのシリアル接続標準であり、RS-422 (EIA RS-422-AStandard) です。 Apple の Macintosh コンピュータのシリアル ポート接続規格。 RS-485 (EIA-485 標準) は RS-422 を改良したものです。

コンピュータ上でシリアル ポート通信とデバッグに必要な準備作業を完了します

ラップトップやデスクトップには基本的にデバッグ用にペアになったシリアル ポートがないため、シリアル ポート デバッグを実現するには仮想シリアル ポート ソフトウェアをダウンロードする必要があります。

仮想シリアル ポート ソフトウェア http://pan.baidu.com/s/1hqhGDbI をダウンロードします (ここで提供されているものは比較的使いやすいです)。ダウンロードとインストールが完了したら、圧縮パッケージ内の vspdctl.dll ファイルをインストール ディレクトリにコピーします (例: 私のディレクトリは –>D:SoftWareInstallVirtual Serial Port Driver 7.2)。ファイルを作成し、正常にアクティベートします。

ソフトウェアを開いて仮想シリアル ポートを追加します。仮想シリアル ポートは通常、図に示すようにペアで追加されます (COM3、COM4 を追加します)。

Javaプログラムとシリアルポート間の通信の実装とデバッグ

追加が完了したら、デバイス マネージャーで確認し、そこにあることを確認します。さらに 2 つの仮想シリアル ポートです。画像:

Javaプログラムとシリアルポート間の通信の実装とデバッグ

シリアル ポート デバッグ ソフトウェアをダウンロードします。http://pan.baidu.com/s/1c0AVaXq ここで提供されているデバッグ ソフトウェアは比較的古いものですが、それでも比較的簡単です使用します。解凍してクリックして開くだけです。

まず、COM3 および COM4 シリアル ポートをそれぞれ表すために使用される 2 つのデバッグ ウィンドウを直接開くことができます。データを正常に送受信するには、2 つのシリアル ポートのパラメータを同じに設定する必要があります。 (デバッグが正常にデータを送受信できる場合は、デバッガをオフにして代わりに Java プログラムを使用できます) 図に示すように:

Javaプログラムとシリアルポート間の通信の実装とデバッグ

Java プログラム コードの作成

この部分が焦点になります。シリアル ポートを使用するには、まず RXTXcomm.jar パッケージをプロジェクトに追加する必要があります (プロジェクトの lib ディレクトリに配置し、ビルド パスに追加します) (win64 ビットのダウンロード アドレス: http://pan.baidu.com) /s/1o6zLmTc); さらに、パッケージを正常にロードして呼び出すことができるように、解凍された rxtxParallel.dll ファイルと rxtxSerial.dll ファイルが %JAVA_HOME%/jre/bin ディレクトリに配置される必要があります。

プログラムコード分析:

package comm;

import java.io.*;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import gnu.io.*;

public class ContinueRead extends Thread implements SerialPortEventListener { // SerialPortEventListener
    // 监听器,我的理解是独立开辟一个线程监听串口数据
    static CommPortIdentifier portId; // 串口通信管理类
    static Enumeration<?> portList; // 有效连接上的端口的枚举
    InputStream inputStream; // 从串口来的输入流
    static OutputStream outputStream;// 向串口输出的流
    static SerialPort serialPort; // 串口的引用
    // 堵塞队列用来存放读到的数据
    private BlockingQueue<String> msgQueue = new LinkedBlockingQueue<String>();

    @Override
    /**
     * SerialPort EventListene 的方法,持续监听端口上是否有数据流
     */
    public void serialEvent(SerialPortEvent event) {//

        switch (event.getEventType()) {
        case SerialPortEvent.BI:
        case SerialPortEvent.OE:
        case SerialPortEvent.FE:
        case SerialPortEvent.PE:
        case SerialPortEvent.CD:
        case SerialPortEvent.CTS:
        case SerialPortEvent.DSR:
        case SerialPortEvent.RI:
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            break;
        case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据
            byte[] readBuffer = new byte[20];
            try {
                int numBytes = -1;
                while (inputStream.available() > 0) {
                    numBytes = inputStream.read(readBuffer);

                    if (numBytes > 0) {
                        msgQueue.add(new Date() + "真实收到的数据为:-----"
                                + new String(readBuffer));
                        readBuffer = new byte[20];// 重新构造缓冲对象,否则有可能会影响接下来接收的数据
                    } else {
                        msgQueue.add("额------没有读到数据");
                    }
                }
            } catch (IOException e) {
            }
            break;
        }
    }

    /**
     * 
     * 通过程序打开COM4串口,设置监听器以及相关的参数
     * 
     * @return 返回1 表示端口打开成功,返回 0表示端口打开失败
     */
    public int startComPort() {
        // 通过串口通信管理类获得当前连接上的串口列表
        portList = CommPortIdentifier.getPortIdentifiers();

        while (portList.hasMoreElements()) {

            // 获取相应串口对象
            portId = (CommPortIdentifier) portList.nextElement();

            System.out.println("设备类型:--->" + portId.getPortType());
            System.out.println("设备名称:---->" + portId.getName());
            // 判断端口类型是否为串口
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                // 判断如果COM4串口存在,就打开该串口
                if (portId.getName().equals("COM4")) {
                    try {
                        // 打开串口名字为COM_4(名字任意),延迟为2毫秒
                        serialPort = (SerialPort) portId.open("COM_4", 2000);

                    } catch (PortInUseException e) {
                        e.printStackTrace();
                        return 0;
                    }
                    // 设置当前串口的输入输出流
                    try {
                        inputStream = serialPort.getInputStream();
                        outputStream = serialPort.getOutputStream();
                    } catch (IOException e) {
                        e.printStackTrace();
                        return 0;
                    }
                    // 给当前串口添加一个监听器
                    try {
                        serialPort.addEventListener(this);
                    } catch (TooManyListenersException e) {
                        e.printStackTrace();
                        return 0;
                    }
                    // 设置监听器生效,即:当有数据时通知
                    serialPort.notifyOnDataAvailable(true);

                    // 设置串口的一些读写参数
                    try {
                        // 比特率、数据位、停止位、奇偶校验位
                        serialPort.setSerialPortParams(9600,
                                SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
                                SerialPort.PARITY_NONE);
                    } catch (UnsupportedCommOperationException e) {
                        e.printStackTrace();
                        return 0;
                    }

                    return 1;
                }
            }
        }
        return 0;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            System.out.println("--------------任务处理线程运行了--------------");
            while (true) {
                // 如果堵塞队列中存在数据就将其输出
                if (msgQueue.size() > 0) {
                    System.out.println(msgQueue.take());
                }
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ContinueRead cRead = new ContinueRead();
        int i = cRead.startComPort();
        if (i == 1) {
            // 启动线程来处理收到的数据
            cRead.start();
            try {
                String st = "哈哈----你好";
                System.out.println("发出字节数:" + st.getBytes("gbk").length);
                outputStream.write(st.getBytes("gbk"), 0,
                        st.getBytes("gbk").length);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {
            return;
        }
    }
}

Javaプログラムとシリアル通信のデバッグ

プログラムデバッグのスクリーンショット:

Javaプログラムとシリアルポート間の通信の実装とデバッグ

概要

シリアル通信は、特に組み込み開発、SMSモジュール開発、さまざまなハードウェア製品のカスタマイズなど、多くの場所で使用されています。ソフトなどが必要となります。その中で、最も一般的に使用される通信プロトコルは RS-232 通信プロトコルです。シリアル通信開発の真の達人になりたいのであれば、シリアル通信プロトコルを完全に理解する必要があります (私はまだ初心者です...願っています)。専門家が指導してくれるでしょう)。

シリアル通信のもう 1 つの焦点は、データの種類を判断し、データを受信した後に有効なデータを抽出する方法です。これらは、対応するプロトコルに従ってコーディングする必要があります。



Java プログラムとシリアル ポート間の通信の実装とデバッグに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?Mar 17, 2025 pm 05:44 PM

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

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Mar 17, 2025 pm 05:35 PM

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

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール