nodejs 树莓派串口数据不正确
nodejs raspberry serialport incorrect data
我想在 Raspberry Pi 1.
上使用 nodeJs v0.12.6 解析串行数据
数据在 cat 上是正确的,但在 nodeJs(串口模块)上乱码了
猫数据正常
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.. <
所有数据都是乱码,为什么?
好像我收到了 8 个字节,然后丢失了 8 个字节,然后收到了 8 个字节,...
这并没有回答为什么字节丢失的问题,但它是检索所有数据的解决方案。
我用的是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 = '';
}
});
看起来 tty 配置不正确。
有
stty -F /dev/ttyAMA0 1200 sane parenb -parodd cs7 -isig -icrnl -crtscts -icanon
serialPort 正在工作。
错误是我依赖于我在 cat /dev/ttyAMA0 上看到的内容。但它只显示可打印的字符,而不是真正的数据。
我想在 Raspberry Pi 1.
上使用 nodeJs v0.12.6 解析串行数据数据在 cat 上是正确的,但在 nodeJs(串口模块)上乱码了
猫数据正常
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.. <
所有数据都是乱码,为什么?
好像我收到了 8 个字节,然后丢失了 8 个字节,然后收到了 8 个字节,...
这并没有回答为什么字节丢失的问题,但它是检索所有数据的解决方案。
我用的是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 = '';
}
});
看起来 tty 配置不正确。 有
stty -F /dev/ttyAMA0 1200 sane parenb -parodd cs7 -isig -icrnl -crtscts -icanon
serialPort 正在工作。
错误是我依赖于我在 cat /dev/ttyAMA0 上看到的内容。但它只显示可打印的字符,而不是真正的数据。