2016-06-29 12 views
0

hereというシリアルポートと通信するためのウェブページを作成する手順に成功しました。そしてここにはGitHub repository for his projectがあります。 Windows COMポートを使用してArduinoデータを偽装するように少し修正しました。今私は私の会社のテストボードの1つと話すためにそれをさらに修正しようとしています。私は双方向通信を確立しているので、私はシリアルポートを介して双方向に話すことができることを知っています。JavaScript文字列のCR LFをnode.jsシリアルポートサーバーに送信

id?CRLFをボードに送信すると、id=91のような応答が得られます。私はPuTTYで、入力キーid? &を入力するか、DockLightでid?rnという送信シーケンスを作成して、両方とも期待どおりに動作すると入力すると、id=91という応答が得られます。

しかし、client.js JavaScriptでは、コンソールにsocket.send("id?\r\n");を送信しようとすると機能しませんが、サーバーの応答に余分な行が表示されます。 2つの余分な行がサーバーにアップ示しているが、

も動作しません
var id = String.fromCharCode(10,13); 
socket.send("id?" + id); 

を:だから私は実行してASCII同等物を送信しようとした

Message received 
id? 
                    <=blank line 

:だから私はこのような何かを参照してください。

Message received 
id? 
                    <=blank line 
                    <=another blank line 

編集:私も試してみた:上記の宣伝文を受け取った最初のメッセージとしてsocket.send('id?\u000d\u000a');同じ結果を。

私が送信されたコマンドを参照してくださいには、(私はクライアントからのメッセージの受信時にconsole.logを行うには、それを少し変更した)サーバーに到着:

function openSocket(socket){ 
console.log('new user address: ' + socket.handshake.address); 
// send something to the web client with the data: 
socket.emit('message', 'Hello, ' + socket.handshake.address); 

// this function runs if there's input from the client: 
socket.on('message', function(data) { 
    console.log("Message received"); 
    console.log(data); 
    //here's where the CRLF should get sent along with the id? command 
    myPort.write(data);// send the data to the serial device 
}); 

// this function runs if there's input from the serialport: 
myPort.on('data', function(data) { 
    //here's where I'm hoping to see the response from the board 
    console.log('message', data); 
    socket.emit('message', data);  // send the data to the client 
}); 
} 

私は肯定ありませんよ CRLFが問題だとは思っていますが、それは確かです。サーバによって飲み込まれている可能性がありますか?

これを文字列に埋め込んでサーバーに送信すると、正しく解釈されてシリアルポートに送信されます。私が読んだ

その他のSOページ:

How can I insert new line/carriage returns into an element.textContent?

JavaScript string newline character?

答えて

0

まあ、それは私はそれがどのように文字列の終端だった、と思ったような問題を正確にCRLFではなかったことが判明処理されていた。すべてのデバイスは、コマンドが処理されたときに「Sプロンプト」(s>)を使用します。ボードが最後に行うことは、Sプロンプトを返すことです。そのため、元のサーバーパーサーコードを変更してそれを探します。しかし、これはレスポンスターミネータであり、リクエストターミネータではありません。私はそれをparser: serialport.parsers.readline('\n')に戻してしまえば、それは働き始めた。

// serial port initialization: 
var serialport = require('serialport'),   // include the serialport library 
SerialPort = serialport.SerialPort,   // make a local instance of serial 
portName = process.argv[2],        // get the port name from the command line 
portConfig = { 
    baudRate: 9600, 
    // call myPort.on('data') when a newline is received: 
    parser: serialport.parsers.readline('\n') 
    //changed from '\n' to 's>' and works. 
    //parser: serialport.parsers.readline('s>') 
}; 
関連する問題