2015-12-05 42 views
2

我想分析的樹莓派與v0.12.6的NodeJS串行數據1樹莓的NodeJS的serialport不正確的數據

數據與貓正確的,但有炒的NodeJS(的SerialPort模塊)

數據與貓

OK
stty -F /dev/ttyAMA0 1200 sane evenp parenb cs7 -crtscts 
cat /dev/ttyAMA0 

MOTDETAT 000000 B 

ADCO XXXXXXXXXXX> 
OPTARIF HC.. < 
ISOUSC 30 9 
HCHC 042116615 
HCHP 034246387 8 
PTEC HP.. 
IINST 001 X 
IMAX 009 H 
HHPHC C . 
MOTDETAT 000000 B 

ADCO XXXXXXXXXXXX> 

result with CR-ETX-STX-LF 其中塊分離器是CR-ETX-STX-LF

2.數據不正確與

的NodeJS

我的服務器的NodeJS

var serialPort = new serialport.SerialPort('/dev/ttyAMA0', { 
    baudrate: 1200, 
    dataBits: 7, 
    parity: 'even', 
    stopBits: 1, 
    flowControl :true,  
    //CR-ETX-STX-BR 
    parser: serialport.parsers.readline(String.fromCharCode(13,3,2,10)) 
}); 

serialPort.on('data', function(data) {  
    console.log("data="+data); 
}); 

結果是

ADCO 0PTARIF H 9 
2116615 
HCHP 031 
.. 
01 X 
9 H 
. 
T 000000 
ADCO 0218 > 
OC.. < 

result with separators

所有數據都是亂碼,爲什麼?

好像我收到8個字節,然後8個字節丟失,則收到8個字節,...

回答

1

貌似TTY沒有得到很好的配置。 With

stty -F /dev/ttyAMA0 1200 sane parenb -parodd cs7 -isig -icrnl -crtscts -icanon 

serialPort現在正在工作。

錯誤是我依靠我看到的貓/ dev/ttyAMA0。但它只顯示可打印的字符,而不是真正的數據。

0

這不回答這個問題,爲什麼字節丟失,但它是獲取所有數據的解決方案。

我使用fs模塊。

注:分離器是ETX和STX(https://en.wikipedia.org/wiki/C0_and_C1_control_codes#STX

fs = require('fs'); 
inp = fs.createReadStream(port); 
inp.setEncoding('utf8'); 
var inputtext = ""; 
var start = false; 
var end = false; 
var charSTX = String.fromCharCode(2); 
var charETX = String.fromCharCode(3); 
inp.on('data', function (data) { 
    var indexOfCharSTX = data.indexOf(charSTX); 
    if(!start){ 
     if(indexOfCharSTX!=-1){ 
      start = true; 
      end = false; 
      inputtext = ''; 
      //after STX and next LF 
      data = data.substr(indexOfCharSTX+2, data.length); 
     }else{ 
      // waiting next data for start character 
      return; 
     } 
    } 

    var indexOfCharETX = data.indexOf(charETX); 
    if(indexOfCharETX!=-1){ 
     //before ETX and previous CR 
     data = data.substr(0, indexOfCharETX-1); 
     end = true; 
    } 

    inputtext+=data; 

    if(end){ 
     //do something with inputtext here 
     start = false; 
     end = false; 
     inputtext = ''; 
    } 
});