1

我对 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');
});

非常感谢任何想法或帮助。

谢谢。

4

2 回答 2

4

我想到了。我放了一个串口监控应用程序,看看发生了什么。

最后的答案是

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 显示屏供应商的文档是不正确的,因为它最后需要 a\r\n而不仅仅是 a \r

C.(有点“duh”的时刻)只是 Javascript 将尝试将任何与字符串连接的内容转换为字符串。所以连接0x80 + '123456\r'变成'128123456\r'.

D. 传递 unicode,就像sp.write('\u0080')最终输出双字符一样,我假设因为 unicode 是每个字符 2 个字节,并且字符串正在被处理/期望单字节编码。 Javascript 字符串是 UTF-16,所以我猜节点串行端口模块不处理它,因为 RS-232 每个字符使用 8 位或更少,属于典型的 ASCII 字符集。

于 2013-08-21T03:37:33.630 回答
0

我在控制台上测试了这个,而不是通过串口,但我认为它应该适合你。

有两种选择:1)您可以转义为 Unicode 或 2)您可以使用 String.fromCharCode 函数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/来自字符代码

转义为 Unicode 非常简单,只需使用 \uXXXX 其中 XXXX 是您的号码的十六进制表示

sp.write('\u0080123456\r');

或者你可以使用 String.fromCharCode:

sp.write(String.fromCharCode(128) + '123456\r');
于 2013-08-20T17:08:24.463 回答