【发布时间】:2020-06-08 14:30:18
【问题描述】:
我有一个串行端口,我想使用节点 js 与之通信。这是成功通信交互的转储。 这是我的规范(异步串行协议) spec doc
(Windows 中的 COM1) successful serial port communication screenshot
但是,当我使用 nodejs 复制该交互时,我没有从端口得到任何响应。 (macOS 中的 /dev/tty.usbserial-14420)
var serialport = require("serialport");
const port = "/dev/tty.usbserial-14420";
const ACK = 0x06;
const NAK = 0x15;
const ENQ = 0x05;
const EOT = 0x04;
const STX = 0xF2;
const ETX = 0x03;
const CMT = "C";
let f3 = new serialport(port, {
baudRate: 9600
})
var Readline = serialport.parsers.Readline; // make instance of Readline parser
var parser = new Readline(); // make a new parser to read ASCII lines
f3.pipe(parser); // pipe the serial stream to the parser
f3.on('open', () => {
console.log('port open');
f3.write(makeMessage1());
f3.write(makeMessage0());
f3.write(makeMessage2());
});
parser.on('data', (data) => {
console.log("data received "+data);
});
f3.on('error', (error) => {
console.log('error: ' + error);
})
function makeMessage0() {
return new Buffer.from('05');
}
function makeMessage1() {
return new Buffer.from('f2 00 00 03 43 30 33 03 b2');
}
function makeMessage2() {
return new Buffer.from('f2 00 00 03 43 32 03 ba');
}
输出:
port open
【问题讨论】:
-
我不知道您使用的语言,但显然异步协议是二进制的(即不是文本),而您似乎正在发送一个由字母数字字符组成的文本字符串。并不是说它真的很重要,但 makeMessage2 没有足够的“字节”来形成至少 9 个字节的最小消息(即它应该与 msg1 的长度相同但更短)。
-
@sawdust 啊,这是有道理的,所以我下一步是弄清楚如何对二进制文件中的内容进行逆向工程
-
"二进制文件里有什么" -- 嗯??!!看你的“串口通信成功”的截图。请注意,左侧具有写入的二进制数据字节的十六进制表示。另请注意,右侧有这些字节的 ASCII 转换。 IOW 您已经拥有(某些)消息的二进制值(以十六进制表示)。您的“下一步”应该是弄清楚/学习如何从十六进制值构造二进制消息缓冲区。
-
BTW 文本字符串具有固有长度,而字节数组必须以特定大小声明/分配,并且您的程序必须显式跟踪该数组中的数据量(即因为没有分隔符字节)。
标签: node.js arduino serial-port serial-communication