我对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');
});
非常感谢任何想法或帮助。
感谢。
答案 0 :(得分:4)
我明白了。我打开了一个串口监控应用程序,看看发生了什么。
最终答案是
一个。当使用数组或缓冲区传递给.write()
方法时,它需要是十进制字符代码(即30表示“0”或13表示回车)或十六进制代码(即。{{1对于数组中的每个项目,对于“0”或0x30
进行回车)。我没有尝试unicode或其他任何东西。但请参阅下面我对此的看法。
B中。事实证明,在我的示例代码中
0x0D
我需要将0x80作为缓冲区/数组发送。所以sp.on("open", function () {
console.log(comPort + ' is open');
sp.write(0x80);
sp.write('123456\r');
});
,没有发送大量的00 00 00 ...但是LED显示供应商的文档不正确,因为它最后需要sp.write([0x80]);
而不仅仅是\r\n
。< / p>
℃。 (有点“呃”时刻)只是Javascript会尝试将与字符串连接的任何内容转换为字符串。因此,\r
连接成0x80 + '123456\r'
。
d。传递unicode,如'128123456\r'
最终输出双字符,我假设因为unicode是每个字符2个字节,并且字符串正在处理/期望单字节编码。 Javascript strings are UTF-16,所以我猜测节点串口模块不能处理它,因为RS-232每个字符使用8位或更少,这属于典型的ASCII字符集。
答案 1 :(得分:0)
我在控制台上测试了这个,而不是通过串口测试,但我认为它应该对你有用。
有两种选择:1)你可以转义为Unicode或2)你可以使用String.fromCharCode函数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
转换为Unicode非常简单,只需使用\ uXXXX,其中XXXX是您的数字的十六进制表示
sp.write('\u0080123456\r');
或者您可以使用String.fromCharCode:
sp.write(String.fromCharCode(128) + '123456\r');