2

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

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

数据正常,猫

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>

结果为 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.. <

带分隔符的结果

所有数据都被加扰,为什么?

好像我收到了 8 个字节,然后丢失了 8 个字节,然后收到了 8 个字节,......

4

2 回答 2

1

看起来 tty 配置不正确。和

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

serialPort 现在正在工作。

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

于 2016-01-10T14:34:18.977 回答
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 = '';
    }
});
于 2015-12-06T00:32:42.820 回答