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

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

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

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

シリアルポート

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

JavaScript

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

Q&A

0回答

2919閲覧

nodeでシリアル通信を同期的に行いたい

apple2

総合スコア37

Node.js

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

シリアルポート

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

JavaScript

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

0グッド

1クリップ

投稿2017/05/26 08:41

編集2022/01/12 10:55

javascript

1var serialport = require('serialport'); 2var portName = '/dev/ttyAMA0'; 3var sp = new serialport.SerialPort(portName, { 4 baudRate: 9600, 5 dataBits: 8, 6 parity: 'none', 7 stopBits: 1, 8 flowControl: false, 9 parser: serialport.parsers.readline('\r') 10 }); 11 12 sp.write( 'mydata\r', function(err, bytesWritten) { 13 console.log('send serial written: ', bytesWritten); 14 }); 15sp.on('data', function(input) { 16var buffer = new Buffer(input, 'utf8'); 17 var sig = buffer.toString(); 18console.log(sig); 19}

こんな感じでnodeを使ってシリアル通信を行なっているのですが、通信が成功したかどうか確かめたいので同期的にsp.writeを行い帰ってきたデータと比較したいのですが、同期的に行うにはどうすればいいでしょう?

こんな風にコールバックの中に受信を入れてみましたが、同じことでした

javascript

1var serialport = require('serialport'); 2var portName = '/dev/ttyAMA0'; 3var sp = new serialport.SerialPort(portName, { 4 baudRate: 9600, 5 dataBits: 8, 6 parity: 'none', 7 stopBits: 1, 8 flowControl: false, 9 parser: serialport.parsers.readline('\r') 10 }); 11 12 sp.write( 'mydata\r', function(err, bytesWritten) { 13 sp.on('data', function(input) { 14 var buffer = new Buffer(input, 'utf8'); 15 var sig = buffer.toString(); 16 console.log(sig); 17 } 18 console.log('send serial written: ', bytesWritten); 19 }); 20

受信を外に出してみましたが
うまくできないです

javascript

1var currentSendTime = Date.now(); 2var currentRecieveTime = currentSendTime; 3 4sp.write( 'something', function(err, bytesWritten) { 5 currentSendTime = Date.now(); 6 currentRecieveTime = currentSendTime; 7 fs.writeFileSync( '/time.txt' , currentRecieveTime );//現在の時間をファイルに書き出し 8 9 var intervalTime = setInterval( function () {//インターバルタイマーをセット 10 currentRecieveTime = parseInt(fs.readFileSync('/time.txt' , 'utf8'));//受信した時間を取得 11 12 if(currentRecieveTime > currentSendTime){ //送った時間より受信した時間があとタイマーストップ 13 clearInterval(intervalTime); 14 console.log('recieved data'); 15 } 16 17 var nowTime = Date.now() 18 if (nowTime > (currentSendTime + 500)){//500msを越えればタイマーストップ 19 clearInterval(intervalTime); 20 console.log('timeout'); 21 } 22 },10);//10msおきにチェック 23}); 24 25sp.on('data', function(input) { 26currentRecieveTime = Date.now(); 27fs.writeFileSync( '/time.txt' , currentRecieveTime ); 28} 29

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問