node.js - Readline 解析器无法从串行端口正确读取 - NodeJS
问题描述
我与 POS(销售点)设备建立了连接。我以十六进制代码发送信息,设备打印收据。
我的问题是解析器 ( Readline
) 不起作用。当我尝试使用parser.on("data", console.log)
时,它不会返回任何东西。这是我的代码:
const SerialPort = require('serialport');// include the library
const WebSocketServer = require('ws').Server;
const SERVER_PORT = 7000; // port number for the webSocket server
const wss = new WebSocketServer({port: SERVER_PORT}); // the webSocket server
var connections = new Array; // list of connections to the server
const Readline = SerialPort.parsers.Readline;
wss.on('connection', handleConnection);
const myPort = new SerialPort("COM3", {
baudRate: 115200,
});
myPort.on('open', showPortOpen);
myPort.on('close', showPortClose);
myPort.on('error', showError);
const parser = myPort.pipe(new Readline('\r\n'))
console.log('parser setup');
parser.on('data', function(data) {
console.log('data received: ', data);
});
function handleConnection(client) {
console.log("New Connection"); // you have a new client
connections.push(client); // add this client to the connections array
client.on('message', sendToSerial); // when a client sends a message,
client.on('close', function() { // when a client closes its connection
console.log("connection closed"); // print it out
var position = connections.indexOf(client); // get the client's position in the array
connections.splice(position, 1); // and delete it from the array
});
}
function sendToSerial(data) {
console.log("sending to serial: " + data);
myPort.write(data, 'hex');
}
// This function broadcasts messages to all webSocket clients
function broadcast(data) {
console.log(data);
for (myConnection in connections) { // iterate over the array of connections
connections[myConnection].send(JSON.stringify(data)); // send the data to each connection
}
}
function showPortOpen() {
console.log('port open. Data rate: ' + myPort.baudRate);
}
function readSerialData(data) {
// if there are webSocket connections, send the serial data
// to all of them:
if (connections.length > 0) {
broadcast(data);
}
}
function showPortClose() {
console.log('port closed.');
}
function showError(error) {
console.log('Serial port error: ' + error);
}
我收到消息,但它们是分开的,我想将整个消息发送给客户端。我试图定义解析器,然后通过管道处理它。我试图在 SerialPort 构造函数中设置解析器,更改了分隔符,但没有结果。我认为我的错误与解析器有关。
这是我使用的结果
myPort.on('data', function(data) {
console.log('data received: ', data);
});
这个想法是在每个命令之后获取整个消息并将其发送给客户端。
解决方案
推荐阅读
- angular - Amazon Polly.Presigner 期望 0-1 个参数,但得到 2 个
- sql - 如何提取列中的某些文本
- mongodb - 返回的文档显示意外值
- vue.js - Computed properties with v-model by index
- java - 保存方法的单元测试失败,错误指向 fc.showSaveDialog(null)
- python - Keras:关于 GPhilo 关于 predict 与 predict_on_batch 的帖子的问题。不能 predict() 已经很好地处理单个图像?
- javascript - 通过组件传递 ng-template
- html - 制作一个 flex 容器的效果
- hazelcast - 有没有办法修改已以声明方式声明的 JCache 的过期策略?
- python - 如何在 Pandas 中获取组中最高值的名称?