【问题标题】:nodejs raspberry serialport incorrect datanodejs树莓串口数据不正确
【发布时间】:2015-12-05 14:06:04
【问题描述】:

我想在 Raspberry Pi 1 上使用 nodeJs v0.12.6 解析串行数据。

cat 的数据是正确的,但 nodeJs(serialPort 模块)打乱了数据

cat 数据正常

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 个字节,...

【问题讨论】:

    标签: node.js raspberry-pi node-serialport


    【解决方案1】:

    看起来 tty 配置不正确。 与

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

    serialPort 现在正在工作。

    错误在于我依赖于我在 cat /dev/ttyAMA0 中看到的内容。但它只显示可打印的字符而不是真正的数据。

    【讨论】:

      【解决方案2】:

      这并不能回答为什么字节丢失的问题,但它是检索所有数据的解决方案。

      我使用 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 = '';
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2016-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        • 2017-05-03
        • 2015-04-26
        • 1970-01-01
        相关资源
        最近更新 更多