質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Q&A

解決済

2回答

2344閲覧

Node.js serialportライブラリにて、readを停止させる方法

DEADBEEF

総合スコア8

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

0グッド

0クリップ

投稿2021/11/12 02:12

編集2021/11/12 02:15

背景・目的

現在、Node.js + serialportライブラリを使用し、
raspiをシリアル接続し、入力したコマンドの結果をコンソールに出力させるスクリプトを作成しています。

最終的には、シリアル通信可能な機器に接続し、コマンドを送受信する事が目的であり、
現在は、Ubuntu搭載機器に接続し、スクリプトを実装しています。

該当のソースコード

Nodejs

1const SerialPort = require('serialport'); 2const { Readline } = SerialPort.parsers; 3const port = new SerialPort("COM6", { baudRate: 115200 }); 4 5port.write('ls\r\n', function (err) { 6 if (err) { 7 console.log('Error writing: ', err.message) 8 } 9}) 10 11const parser = port.pipe(new Readline({ delimiter: '\r\n' })); 12parser.on('data', (value) => { 13 console.log(value); 14})

発生している事象

上記スクリプトを実行すると、下記の様に出力されます。

node .\main.js ls sample_1 sample_2 sample_3 sample_4 sample_5 ubuntu@ubuntu:~$      ←ここは空白になっており、何も出力する文字が無い場合、このまま固まり、処理が全く進まない。

出力結果は理想なのですが、問題は処理の話であり、
上記スクリプトでの実行結果は、ユーザが強制終了をさせない限り(Ctrl + C)、ずっと動作し続ける(処理が固まっているように見える)事になっております。

また、この動作はThreadX、Ubuntuの両方で確認が取れています。

解決したい内容

原因は、予想としては下記の

parser.on('data', (value) => { console.log(value); })

だと考えているのですが、終了させる処理が、公式サイトにもStack OverFlowにも見当たらず、1か月程沼にはまっております。

最終目的は、この処理を終了させることです。
(具体的には、エンターキーを押せば反応する)

どなたか、ご教授の程、お願いいたします。

補足情報(FW/ツールのバージョンなど)

OS : Windows 10 Pro
Node.js : v14.18.0
serialport : v9.2.4
使用機器 : raspi3 model-B (Ubuntu 20.04.02 LTS)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自分なりの回答が出たので、ここに回答します。

シリアルコンソールで出力される「プロンプト名」
でクローズする処理を組み込むことで、この質問の処理が実現できました。

Node.js初心者のスクリプトの為、
不備などは各自修正してください。(下記は動作検証済)

Nodejs

1async function Execute_Command(send_command, prompt_name) { 2 const DATA_FILE = "./hoge,txt"; 3 4 await new Promise(function (resolve, reject) { 5 PORT.write(send_command + "\r\n"); 6 PORT.on('data', (data) => { 7 Fs.appendFileSync(DATA_FILE, data); 8 9 if (data.toString().includes(prompt_name)) { 10 PORT.close(); 11 resolve(); 12 } 13 }); 14 }); 15 16 let file_data = Fs.readFileSync(DATA_FILE, "ascii"); 17 if (!file_data == "") { 18 Fs.unlinkSync(DATA_FILE); 19 } 20 let ret_str = file_data.replace(send_command, "").replace(prompt_name, ""); 21 return ret_str.toString(); 22}

投稿2021/11/19 07:30

DEADBEEF

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

serialportのソースを辿って行ったらcloseメソッドがありました。

Javascript

1//@serialport\stream\lib\index.js 412行目から 2/** 3 * Closes an open connection. 4 * 5 * If there are in progress writes when the port is closed the writes will error. 6 * @param {errorCallback} callback Called once a connection is closed. 7 * @param {Error} disconnectError used internally to propagate a disconnect error 8 * @emits close 9 * @returns {undefined} 10 */ 11SerialPort.prototype.close = function (callback, disconnectError) { 12 disconnectError = disconnectError || null 13 14 if (!this.isOpen) { 15 debug('close attempted, but port is not open') 16 return this._asyncError(new Error('Port is not open'), callback) 17 } 18//以下略 19

これで行けませんか?

※追記
シリアルポートを閉じたいタイミングでcloseするという事です。

Javascript

1SerialPort.close();

投稿2021/11/12 05:47

編集2021/11/13 05:43
AT_2nd

総合スコア266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DEADBEEF

2021/11/14 23:55 編集

ご回答ありがとうございます。 こちらの回答が遅くなりました。 =============== SerialPort.close(); =============== 関数を、任意の場所に組み込んで実行させました。 ================================================ const parser = port.pipe(new Readline({ delimiter: '\n' })); parser.on('data', (value) => { console.log(value); // クローズさせる処理をここに挿入 if (value.includes("/dev/null")) { if (value === "") { console.log("portを閉じます") port.close(function (err) {}); } } ================================================ 上記に書き換えたら、closeが機能しました。 ありがとうございます。 ここからは、Teratermでコマンドが終了しているメカニズム(終端コードを読み取っている?) を解析し、コマンドを終了させられるようしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問