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

推薦する

HTMLは正規表現を使用してテーブルの例をテストします

以下は、HTML で正規表現を使用してテーブルをチェックするサンプル コードです。具体的なコードの内...

Angularルーティングアニメーションと高度なアニメーション機能の詳細な説明

目次1. ルーティングアニメーション2. グループクエリとスタガー1. ルーティングアニメーションル...

ハイパーリンクに関するいくつかの質問

<br />ポテトチップスパーティーのこのエピソードに参加して、何人かの友達に会えてとて...

Docker で Harbor パブリック リポジトリを構築する方法の例

前回のブログ投稿では、レジストリのプライベート ウェアハウスについて説明しました。今日は、Harbo...

Vue双方向バインディングの詳細な説明

目次1. 双方向バインディング2. 他のタグを選択した場合にも同じ結果になりますか? 答えはもちろん...

mysql.data.dll ドライバーのさまざまなバージョンの簡単な分析

ここにmysqlドライバmysql.data.dllがあります知らせ:ここではX86バージョンが多く...

HTML タグのカスタム属性に関する質問

以前の開発では、クラス、名前などの HTML のデフォルト属性を使用していました。 Huawei社の...

jQuery はシャッター効果を実現します (li 配置を使用)

この記事では、ブラインド効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具体...

vue+tsは要素のマウスドラッグの効果を実現します

この記事の例では、要素のマウスドラッグ効果を実現するためのvue+tsの具体的なコードを参考までに共...

MySQL 5.7.20 のインストールと設定方法のグラフィック チュートリアル (win10)

この記事では、MySQL 5.7.20のインストールと設定方法を参考までに紹介します。具体的な内容は...

LeetCode の SQL 実装 (182. 重複するメールボックス)

[LeetCode] 182.重複メールPerson という名前のテーブル内のすべての重複メールを...

HTML でよく使われるタグの概要 (必読)

コンテンツ詳細タグ: <h1>~<h6>タイトルタグ<pre>テ...

Rabbitmq heartbea ハートビート検出メカニズムの原理の分析

序文RabbitMQ を使用する場合、一定期間クライアントと RabbitMQ サーバーの間でトラフ...

JavaScript はクリックして画像の形状を変更する (変換アプリケーション) を実装します。

JavaScriptをクリックすると画像の形状が変わります(変形の応用)。参考までに具体的な内容は...

WebプロジェクトのDockerデプロイメントの実装

前回の記事では、docker サービスをインストールしました。引き続き、Web プロジェクトのデプロ...