我对 rs232 的了解几乎一无所知。我有一个连接到串行端口的 LED 显示屏。我使用的是node.js v8.22 和node-serialport v1.1.0。
LED 显示屏的用户指南要求发送 [hex80]xxxxxx[cr],其中每个“x”是一个数字 (0-9)。我的波特率也设置为 9600。
我假设我可以写
sp.write(0x80);
sp.write('123456\r');
但老实说,我只是不知道如何将 [hex80]xxxxxx[cr] 转换为 javascript/serialport 需求。我尝试过各种方法。
sp.write([0x80,55,55,55,49,49,48,'\r']);//hex80 + 所有数字的字符代码 sp.write(128+'123456\r')//128 是十进制的 0x80
我得到了一些困惑的东西要显示。完整代码如下。
var serialPort, sp;
var comPort = '/dev/cu.usbserial';
var serialPort = require('serialport').SerialPort
sp = new serialPort(comPort, { baudrate: 9600, parser: parserJaCircuitsChrono() });
sp.on("open", function () {
console.log(comPort + ' is open');
sp.write(0x80);
sp.write('123456\r');
});
非常感谢任何想法或帮助。
谢谢。
最佳答案
我明白了。我安装了一个串行端口监控应用程序来查看发生了什么。
最终答案是
A.当使用数组或缓冲区传递给 .write()
方法时,它需要是十进制字符代码(即 30 表示“0”或 13 表示回车)或十六进制代码(即 0x30
代表“0”,0x0D
代表回车)数组中的每个项目。我没有尝试 unicode 或其他任何东西。但请参阅下面我对此的想法。
B.事实证明,在我的示例代码中
sp.on("open", function () {
console.log(comPort + ' is open');
sp.write(0x80);
sp.write('123456\r');
});
我需要将 0x80 作为缓冲区/数组发送。所以 sp.write([0x80]);
,如果没有它发送大量 00 00 00...s 但是 LED 显示屏供应商的文档不正确,因为它需要 \r\n
位于末尾,而不仅仅是 \r
。
C. (有点“duh”的时刻)只是 JavaScript 会尝试将任何与字符串连接的内容转换为字符串。因此,连接 0x80 + '123456\r'
会变成 '128123456\r'
。
D.传递 unicode,如 sp.write('\u0080')
最终输出双字符,我假设因为 unicode 每个字符 2 个字节,并且字符串正在被处理/期望单字节编码。 Javascript strings are UTF-16 ,所以我猜测 Node 串行端口模块无法处理它,因为 RS-232 每个字符使用 8 位或更少,属于典型的 ASCII 字符集。
关于node.js 串行端口,尝试编写但我无法弄清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327807/