Node.js での SerialPort モジュールの使用

Node.js での SerialPort モジュールの使用

目的

シリアルポートは、ホストコンピュータとさまざまな回路モジュール間の通信によく使用されます。Node.js でシリアルポートを操作するには、SerialPort モジュールを使用できます。この記事では、その使い方について簡単に説明します。

公式サイト: https://serialport.io/
ドキュメント: https://serialport.io/docs/
プロジェクトアドレス: https://github.com/serialport/node-serialport

現在のSerialPortモジュールのバージョンは9.2.7です

モジュールのインストール

SerialPort モジュールをインストールするには、次のコマンドを使用します。

npm シリアルポートをインストール

SerialPort モジュール関数の一部は C/C++ で実装されているため、異なるプラットフォームでは、そのプラットフォームで実行するためのバイナリ ファイルが必要になります。一般的なプラットフォームでは、通常、事前にコンパイルされたバイナリ ファイルがあります。そうでない場合は、通常は node-gyp (Python 3.x に依存) を使用してコンパイルを試みます。通常、パッケージ マネージャーは関連する事項を自動的に処理します。

ここに画像の説明を挿入

場合によっては、または一部のプラットフォームでは、手動でのコンパイルが必要になることがあります。コンパイルには、プラットフォーム上の対応するコンパイル ツールが必要です。記事「Node.js 入門 02: パッケージ マネージャー npm」のモジュール コンパイルの章を参照してください。

コンパイル ツールをインストールした後、SerialPort モジュールを再インストールするか、手動でコンパイルすることができます。詳細については、SerialPort モジュールのドキュメントの「SerialPort のインストール」セクションを参照してください: https://serialport.io/docs/guide-installation/

基本的な使い方

SerialPort モジュールをインストールしたら、 const SerialPort = require('serialport')を使用してインポートできます。

ポートをスキャンする

次のデモのようにSerialPort.list(): Promise<PortInfo[]>静的メソッドを使用して、デバイス上のシリアル ポート リストを取得します。

定数 SerialPort = require('serialport');

SerialPort.list().then((ポート) => {
    console.log(ports); // シリアルポートリストを出力します }).catch((err) => {
    コンソールログ(エラー);
});

ここに画像の説明を挿入

このリストには同じポートが繰り返し表示される場合があることに注意してください。

上記のメソッドを async / await を使用して使用することもできます。

定数 SerialPort = require('serialport');

(非同期() => {
    試す {
        ポートを待機します。SerialPort.list();
        console.log(ports); // シリアルポートリストを出力 } catch (error) {
        コンソール.log(エラー);
    }
})();

ここに画像の説明を挿入

開いているポート

デフォルトでは、SerialPort オブジェクトを作成すると、次のようにポートが開きます。

定数 SerialPort = require('serialport');

const port = new SerialPort('COM6', (err) => {
    もし(エラー){
        console.log('ポートのオープンに失敗しました!');
        戻る;
    }
    console.log('ポートが正常に開かれました!');
});

SerialPort クラスのコンストラクターには、オブジェクトの作成時にポートが自動的に開かれるかどうかを制御する autoOpen オプションがあります。デフォルトではポートが自動的に開かれますが、後で手動でポートを開くことができるようにオフにすることもできます。

定数 SerialPort = require('serialport');

const port = new SerialPort('COM6', { autoOpen: false });

ポート.open(関数(エラー) {
    もし(エラー){
        console.log('ポートのオープンに失敗しました!');
        戻る;
    }
    console.log('ポートが正常に開かれました!');
});

SerialPort クラスのコンストラクターでは、baudRate オプションを使用してシリアル ポート通信のボー レートを設定できます。デフォルトは 9600 です。

定数 SerialPort = require('serialport');

const port = new SerialPort('COM6', { baudRate: 115200 }); // ボーレートを115200に設定する

詳細については、SerialPort クラスの構築方法に関する次のセクションを参照してください。

データの送信

SerialPort オブジェクトのwriteメソッドを使用してデータを送信できます。このメソッドは、送信するデータを送信バッファに格納し、次のように順番に送信します。

定数 SerialPort = require('serialport');
const ポート = 新しい SerialPort('COM6');

port.write('Hello world!\n'); // 文字列を送信 port.write(Buffer.from('Hey!\n')); // バッファー データを送信 port.write(new Uint8Array([0x48, 0x69, 0x21, 0x0A])); // バイト配列を送信

ここに画像の説明を挿入

writeメソッドではコールバック関数を追加することもできます。

定数 SerialPort = require('serialport');
const ポート = 新しい SerialPort('COM6');

port.write('Hello world!\n', (err) => {
    もし(エラー){
        console.log('書き込み操作に失敗しました!');
        戻る;
    }
    console.log('書き込み操作が成功しました!');
});

上記のコールバック関数が異常でない状態でトリガーされた場合、それはwriteメソッド自体が操作を完了したdrainを意味するだけで、ポートからデータが完全に送信されたことを意味するわけではないことに注意してください。drain メソッドを使用してこれを処理できます。このメソッドは、送信が完了するまでブロックします。

定数 SerialPort = require('serialport');
const ポート = 新しい SerialPort('COM6');

port.write('こんにちは世界!\n');
ポート.drain(err => {
    (エラー) の場合、戻ります。
    console.log('送信が完了しました!');
});

データの受信

データを受信するには、次の方法を使用できます。

定数 SerialPort = require('serialport');
const ポート = 新しい SerialPort('COM6');

// 一時停止モードで受信データをリッスンし、アクティブにデータを読み取ります port.on('readable', () => {
    console.log(port.read()); // データを読み込むには read メソッドを使用します。読み込むバイト数を指定できます});

// フローモードで受信したデータをリッスンする port.on('data', (data) => {
    コンソールにログ出力します。
});

ここに画像の説明を挿入

上記の方法に加えて、 pipeを使用してデータを別のストリームに転送することもできます。

エラー処理

SerialPort オブジェクトのほとんどの操作にはコールバック関数があり、コールバック関数の最初のパラメーターは例外オブジェクトです。さらに、エラー イベントを使用して例外を均一に処理することもできます。

定数 SerialPort = require('serialport');
const ポート = 新しい SerialPort('COM6');

ポート.on('エラー', err => {
    コンソールログ(エラー);
});

データパーサー

SerialPort モジュールには、受信したシリアル ポート データの一般的な形式を処理するために主に使用されるいくつかのデータ パーサーが用意されています。提供される主な機能は次のとおりです。

バイト長パーサー
受信したデータの長さに基づいて解析します。

定数 SerialPort = require('serialport');
const ポート = 新しい SerialPort('COM6');

定数 ByteLength = require('@serialport/parser-byte-length');
const parser = port.pipe(new ByteLength({ length: 8 })); // トリガー parser.on('data', chunk => {
    console.log(chunk); // 受信したデータを出力します });

ここに画像の説明を挿入

ccTalk パーサー
ccTalk 形式のデータを解析します。https://en.wikipedia.org/wiki/CcTalk を参照してください。

区切り文字パーサー
指定された文字を境界としてデータを処理します。

定数 SerialPort = require('serialport');
const ポート = 新しい SerialPort('COM6');

const デリミタ = require('@serialport/parser-delimiter');
const parser = port.pipe(new Delimiter({ delimiter: '\n' })); // \n で区切られたデータを処理します parser.on('data', chunk => {
    console.log(chunk.toString()); // 受信したデータを出力します });

ここに画像の説明を挿入

区切り文字オ​​プションは、string|Buffer|number[] にすることができます。includeDelimiter オプションは、区切り文字がデータに含まれるかどうかを示します。デフォルトでは区切り文字は含まれません。

InterByteTimeout パーサー
指定された時間内にデータが受信されない場合、解析がトリガーされます:

定数 SerialPort = require('serialport');
const ポート = 新しい SerialPort('COM6');

const InterByteTimeout = require('@serialport/parser-inter-byte-timeout');
const parser = port.pipe(new InterByteTimeout({interval: 2000})); // 2000ミリ秒間データが受信されないと parser.on('data', chunk => {
    console.log(chunk); // 受信したデータを出力します });

ここに画像の説明を挿入

maxBufferSize オプションは、タイムアウトがない場合でも、この量のデータを受信した後にアクションがトリガーされることを指定するために使用されます。

Readline パーサー
データを行単位で解析します。デフォルトの行区切り文字は\nです。区切り文字オ​​プションを使用して、 \r\nなどの別の区切り文字にリセットできます。

準備完了パーサー
解析はフラグから始まります。

正規表現パーサー
正規表現を区切り文字として使用して解析します。

SerialPort クラス

SerialPort モジュールの主な用途は、SerialPort モジュール ドキュメントのストリーム インターフェイスの章で紹介されている SerialPort クラスを使用することです: https://serialport.io/docs/api-stream。ここでは、その内容の一部を簡単に抜粋します。

施工方法

new SerialPort(path [, openOptions] [, openCallback])

コンストラクターはシリアル ポート オブジェクトを作成するために使用され、path はシリアル ポート番号、openCallback は自動オープンが失敗した場合のコールバック関数です。

openOptions の一般的なオプションは次のとおりです。

オプションタイプ例示するデフォルト値
自動開くブール値ポートを自動的に開く真実
ボーレート番号ボーレート9600
データビット番号データビット、オプション値: 8、7、6、5 8
ハイウォーターマーク番号読み取りおよび書き込みキャッシュのサイズ65536
ロックブール値他のプラットフォームがポートを開けないようにポートをロックします (false は Windows ではサポートされていません)真実
ストップビット番号ストップビット、オプション値: 1、2 1
パリティチェック、オプション値: なし、偶数、マーク、奇数、スペースなし
rtsctsブール値フロー制御設定間違い
クソンブール値フロー制御設定間違い
xoffブール値フロー制御設定間違い
ザニブール値フロー制御設定間違い

財産

SerialPort には、読み取るための次のプロパティがあります。
pathbaudRateisOpenbinding

イベント

SerialPort によってトリガーされるイベントは次のとおりです。

  • openポートが開かれたときにトリガーされます。
  • エラーが送信されるとerrorがトリガーされます。
  • closeポートが閉じられたときにトリガーされます。
  • dataが受信されるとデータがトリガーされます。
  • 書き込みメソッドが false を返す場合、書き込みメソッドが再度呼び出されたときにイベントがトリガーさdrainます。

方法

SerialPort で使用できるメソッドの一部を以下に示します。

  • open(() => {}): voidポートを開きます。
  • update(options: updateOptions, callback?: err => {}): voidボーレートを変更します。
  • write(data: string|Buffer|Array<number>, encoding?: string, callback?: error => {}): booleanデータを送信します。
  • read(size?: number): string|Buffer|nullデータを読み取ります。
  • close(callback?: error => {}): voidポートを閉じます。
  • set(options: setOptions, callback?: error => {}): voidフロー制御を設定します。
  • get(callback: (error, data: ModemStatus) => {}): void開かれたポートのフロー制御ステータスを取得します。
  • flush(callback? error => {}):void受信バッファと送信バッファ内の未処理データをクリアします。
  • drain(callback? error => {}):voidデータが送信されるまで待機します。
  • pause(): this停止し、データ イベントをトリガーして、一時停止モードに切り替えます。
  • resume(): thisデータ イベントを再開し、一時停止モードからフロー モードに切り替えます。

コマンドラインツール

SerialPort モジュールは、コマンド ライン インターフェイスで直接使用できるコマンド ライン ツールもいくつか提供します。以下は、公式サイトのホームページの使用例です。

ここに画像の説明を挿入

詳細については、SerialPort モジュールのドキュメントの「コマンドライン ツール」セクションを参照してください: https://serialport.io/docs/guide-cli

要約する

Node.js の SerialPort モジュールの主な使用方法は上記の内容になります。

もう一つの注目すべき点は、SerialPort モジュールはシリアル ポートを直接操作するのではなく、各プラットフォームの基盤となるインターフェイスを呼び出してシリアル ポートを使用するということです。関連コンテンツを開発している場合や特別なニーズがある場合は、SerialPort モジュール ドキュメントの Binding 関連コンテンツを参照してください。

Node.js での SerialPort (シリアルポート) モジュールの使用に関するこの記事はこれで終わりです。Node.js SerialPort に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Node.js のモジュール性、npm パッケージ マネージャーの説明
  • NodeJSのモジュール性に関する詳細な説明
  • Node.js組み込みモジュールの詳細な説明
  • node.jsのコアモジュールとは

<<:  CSS3 の Flex レイアウトの詳細な分析

>>:  CSSは指定された長さの文字列を自動的にインターセプトし、末尾を表示します...FFブラウザをサポート

推薦する

vue-cli4.5.xはプロジェクトを素早く構築します

1. vue-cliをインストールする vue.js で vue.js を実行します。 2. プロジ...

負のz-indexを持つ要素がクリックできない問題の解決策

最近、ポップアップ広告に取り組んでいました。デフォルト ページには z-index が設定されていな...

HTMLにリンクを挿入する方法

各 Web ページには、URL () で識別されるアドレスがあります。通常、Web サイト内でリンク...

Reactのdiffアルゴリズムの詳細な分析

Reactのdiffアルゴリズムの理解diffアルゴリズムは、 Virtual DOMの変更された部...

Windows で nginx を素早くインストールし、自動的に起動するように設定する

目次1. Windows システムでの Nginx のインストールと起動プロセス: 2. 起動時にN...

CentOS 6.x のインストール時に発生するエラー「ディスク sda に BIOS RAID メタデータが含まれています」の解決方法

今日、CentOS6.2 をインストールしていたところ、ハード ドライブの検出段階を通過できませんで...

あまり多くのコードを書かずに、ハイパーリンクを使ってシンプルで美しいカスタムチェックボックスを実装できます。

今日ふと、HTML でチェックボックスのスタイルを変更できる範囲が限られていることと、チェックボック...

nginx httpモジュールのデータ保存構造の概要

このセクションから、http モジュールの実装原理について説明します。http モジュールで非常に重...

docker-compose を使用して Apollo カスタム環境をデプロイする詳細なチュートリアル

目次アポロ コンフィギュレーション センターとは何ですか?アポロの特徴クライアントアーキテクチャアー...

MySQL FAQ シリーズ: 一時テーブルを使用する場合

一時テーブルの概要一時テーブルとは: MySQL は中間結果セットを保存するために使用されます。一時...

Nginx 502 Bad Gateway エラーの原因と解決策

Nginx 502 Bad Gateway エラーに何度か遭遇しました。ここでメモしておこうと思いま...

Tomcat を使用して IntelliJ IDEA によってデプロイされたプロジェクトの場所はどこですか?

IntelliJ IDEA が Tomcat を使用して Javaweb プロジェクトをデプロイし...

docker ポートを追加して dockerfile を取得する方法

DockerイメージからDockerfileを取得する docker 履歴 --format {{....

OCSP を有効にすると、https 証明書の検証効率が向上し、Let's Encrypt SSL 証明書へのアクセスが遅くなる問題が解決されます。

ここ数日、ウェブサイトを初めて開いたときにアクセスが非常に遅いのですが、その後はページが正常に開きま...

Vueページの画像が表示されない問題の解決方法

新しいバージョンの設定インターフェースを作る際に、vueフレームワークを使用して実装しました。ページ...