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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1295閲覧

node シリアル書き出の順番

apple2

総合スコア37

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/06/28 07:36

javascript

1var sp = new serialport.SerialPort(portName, { 2 baudRate: 9600, 3 dataBits: 8, 4 parity: 'none', 5 stopBits: 1, 6 flowControl: false, 7 parser: serialport.parsers.readline('\r') 8 }); 9 10sp.write( 'command1\r', function(err, bytesWritten) { 11 console.log("send command1"); 12 setTimeout(function(){ 13 sp.write( 'command2\r', function(err, bytesWritten) { 14 console.log("send command2"); 15 }); 16 } ,100); 17 }); 18

nodeで、こんな感じのコードを書いて見たのですが
ときどきcommand2の方がcommand1より先に出力されてしまうことがあります
何故でしょう?必ず順番を守れるようにならないのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

Promiseを使って解決出来ます。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise
http://qiita.com/koki_cheese/items/c559da338a3d307c9d88
http://junmt.hatenablog.com/entry/2015/12/11/171045

手元にnode.js環境がないので、動作検証できていないのですが、元コードを置き換えるとおおよそ以下のような感じになると思います。

javascript

1var sp = new serialport.SerialPort(portName, { 2 baudRate: 9600, 3 dataBits: 8, 4 parity: 'none', 5 stopBits: 1, 6 flowControl: false, 7 parser: serialport.parsers.readline('\r') 8 }); 9 10var spWrite = function (portName) { 11 return new Promise(function(resolve, reject) { 12 sp.write(portName + '\r', function (err, bytesWritten) { 13 resolve('send: ' + portName); 14 }); 15 }); 16}; 17 18spWrite('command1') 19 .then(function (result) { 20 console.log(result); 21 return spWrite('command2'); 22 }) 23 .then(function (result) { 24 console.log(result); 25 });

他、Promise.allやasync/awaitもあるので合わせて、試してみてください。

投稿2017/06/28 08:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

apple2

2017/06/28 14:07

ありがとうございます 難しそうでうですけど、試して見ます
apple2

2017/06/29 09:49

promiseが使えないバージョンだったので、nodeのバージョンを4.8.2にあげたのですが serialportが使えなくなり npm install serialportでインストールしようとするとエラーになり つまづいています
apple2

2017/06/29 12:32 編集

nodeのバージョンをv0.11.14 にして無事にserialportがインストールでき、教えてもらったPromiseを試してみたのですが、以前と同じように逆転現象が起きました 受信する側の都合もあってインターバルを置きたく var spWrite = function (portName) { return new Promise(function(resolve, reject) { setTimeout(function(){ sp.write(portName + '\r', function (err, bytesWritten) { resolve( portName); }); },400); } ); }; setTimeoutを追加しました
apple2

2017/06/29 13:07

私のインターバルの取り方がまずいのでしょうかね
退会済みユーザー

退会済みユーザー

2017/06/29 13:23

よくよくapple2さんが質問で記述されているコードを見直してみると、処理の流れとしては「command1」->「command2」となるはずですね(setTimeoutで処理をずらさなくても)。 同様の環境が用意できないので、ちょっと手詰まりな感じです。 引っ掻き回すだけとなってしまい、申し訳ありませんでした。
apple2

2017/06/29 20:30

本当はシリアルの接続先では送ったコマンドがループバックされる仕組みになっていて、送ったコマンドが帰ってから次のコマンドを送るということがしたいのです。 今は受信の部分で帰ってきたdataとportNameを比較して合否を出すというようなことをやっているのですが、私のやり方が根本的に間違っているのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問