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ブラウザをサポート

推薦する

JavaScript の for/of、for/in の詳細な紹介

目次JavaScriptでは、 forループを記述する一般的な方法がいくつかあります。最初の、そして...

MySQLクエリプランでken_lenの値を計算する方法

key_lenの意味MySQL では、次に示すように、explain を使用して SQL ステートメ...

16 の XHTML1.0 と HTML の互換性ガイドラインの概要

1.ページを XML タイプとして宣言しないでください。ページでは UTF-8 または UTF-16...

「いいね!」機能では MySQL と Redis のどちらを使用すればよいでしょうか?

目次1. 初心者が陥りがちな間違い2. Iteratorのremove()メソッドを使用する3. f...

Docker ベースの Tomcat クラスタと Nginx ロード バランシングの展開の概要

目次前面に書かれた1. Ngixnイメージの作成2. Java Web (Tomcat) アプリケー...

MySQL ストアド プロシージャにおけるループ ステートメント (WHILE、REPEAT、LOOP) の使用法の分析

この記事では、例を使用して、MySQL ストアド プロシージャでのループ ステートメント (WHIL...

Centos6 で 20TB を超えるディスクをパーティション分割してフォーマットするためのサンプル コード

1. サーバー環境の構成: 1. ディスクパーティションを確認します。最近、あるプロジェクト内のサー...

CSS3 で King of Glory マッチング人員読み込みページを実装する方法

King of Glory をプレイしたことがある人なら、このページの効果をよくご存知でしょう。なぜ...

mysqldump でデータベースをバックアップするときに特定のライブラリを除外する例

例: mysqldump –all-databases を使用すると、すべてのライブラリがエクスポー...

Windows でのシンプルな Mysql バックアップ BAT スクリプトの共有

序文この記事では、Windows で Mysql をバックアップするための簡単な BAT スクリプト...

MySQL マスタースレーブレプリケーション切断の一般的な修復方法

目次01 問題の説明02 ソリューション1. 他のスレーブライブラリを見つけてすぐに置き換える2. ...

MySQL 5.7.33 インストール プロセスの詳細な図解

目次インストールパッケージのダウンロードインストール環境変数の設定インストールが成功したか確認する記...

PostgreSQL データベースにおける varchar、char、text の比較に関する簡単な説明

以下のように表示されます。名前説明する文字可変(n)、varchar(n)長さ制限あり、可変長文字(...

MySQL Innodb インデックス メカニズムの詳細な紹介

1. インデックスとは何ですか?インデックスは、ストレージ エンジンがレコードをすばやく検索するため...

Ubuntu 20.04 に GitLab をインストールして設定する方法

導入GitLab CE または Community Edition は、主に Git リポジトリのホ...