使用Node.js进行串口通信

目录

  • [一、 安装 serialport 库](#一、 安装 serialport 库)
  • 二.、实现方法
    • 1.打开串口并配置参数
    • [2. 向串口传递信息](#2. 向串口传递信息)
    • [3. 接收串口信息](#3. 接收串口信息)
    • [4. 处理错误](#4. 处理错误)
    • [5. 关闭串口](#5. 关闭串口)
    • [6. 使用解析器](#6. 使用解析器)
    • [7. 获取串口列表](#7. 获取串口列表)
  • [三、 完整示例代码](#三、 完整示例代码)

一、 安装 serialport 库

首先,需要安装 serialport 库。可以通过 npm 安装:

bash 复制代码
npm install serialport

二.、实现方法

1.打开串口并配置参数

创建一个串口对象并配置串口参数,例如波特率、数据位、停止位和校验位等。

javascript 复制代码
const SerialPort = require('serialport');

// 创建串口对象
const port = new SerialPort('/dev/tty-usbserial1', {
  baudRate: 9600, // 波特率
  dataBits: 8,    // 数据位
  parity: 'none', // 校验位
  stopBits: 1,    // 停止位
  autoOpen: false // 不自动打开串口
});

// 打开串口
port.open((err) => {
  if (err) {
    console.error('Error opening port:', err.message);
    return;
  }
  console.log('Port opened successfully');
});

2. 向串口传递信息

使用 write 方法向串口发送数据。

javascript 复制代码
// 向串口发送数据
port.write('Hello Serial Port', (err) => {
  if (err) {
    console.error('Error on write:', err.message);
    return;
  }
  console.log('Message written');
});

3. 接收串口信息

通过监听 data 事件来接收串口发送的数据。

javascript 复制代码
// 监听数据事件
port.on('data', (data) => {
  console.log('Received data:', data.toString());
});

4. 处理错误

监听 error 事件来处理串口通信中可能出现的错误。

javascript 复制代码
// 监听错误事件
port.on('error', (err) => {
  console.error('Error:', err.message);
});

5. 关闭串口

在完成通信后,可以关闭串口以释放资源。

javascript 复制代码
// 关闭串口
setTimeout(() => {
  port.close((err) => {
    if (err) {
      console.error('Error closing port:', err.message);
      return;
    }
    console.log('Port closed successfully');
  });
}, 10000); // 10秒后关闭串口

6. 使用解析器

为了更好地处理接收到的数据,可以使用解析器。例如,使用 @serialport/parser-inter-byte-timeout 解析器来处理分包问题。

javascript 复制代码
const { InterByteTimeoutParser } = require('@serialport/parser-inter-byte-timeout');

const parser = port.pipe(new InterByteTimeoutParser({ interval: 300 }));

parser.on('data', (data) => {
  console.log('Received data:', data.toString());
});

7. 获取串口列表

可以使用 SerialPort.list() 方法获取当前系统中可用的串口列表。

javascript 复制代码
SerialPort.list().then((ports) => {
  ports.forEach((port) => {
    console.log('Available port:', port.path);
  });
});

三、 完整示例代码

以下是一个完整的示例代码,展示了如何在 Node.js 中打开串口、发送数据和接收数据:

javascript 复制代码
const SerialPort = require('serialport');
const { InterByteTimeoutParser } = require('@serialport/parser-inter-byte-timeout');

// 创建串口对象
const port = new SerialPort('/dev/tty-usbserial1', {
  baudRate: 9600,
  dataBits: 8,
  parity: 'none',
  stopBits: 1,
  autoOpen: false
});

// 打开串口
port.open((err) => {
  if (err) {
    console.error('Error opening port:', err.message);
    return;
  }
  console.log('Port opened successfully');

  // 创建解析器
  const parser = port.pipe(new InterByteTimeoutParser({ interval: 300 }));

  // 监听数据事件
  parser.on('data', (data) => {
    console.log('Received data:', data.toString());
  });

  // 监听错误事件
  port.on('error', (err) => {
    console.error('Error:', err.message);
  });

  // 向串口发送数据
  port.write('Hello Serial Port', (err) => {
    if (err) {
      console.error('Error on write:', err.message);
      return;
    }
    console.log('Message written');
  });

  // 关闭串口
  setTimeout(() => {
    port.close((err) => {
      if (err) {
        console.error('Error closing port:', err.message);
        return;
      }
      console.log('Port closed successfully');
    });
  }, 10000); // 10秒后关闭串口
});
相关推荐
hasty9 小时前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
福兮说20 小时前
前后端算的 MD5、SHA-256 对不上?编码、换行、BOM、HMAC、JSON 顺序,八个原因逐个实测
前端·javascript·node.js·json·哈希算法
lingchen190621 小时前
Node.js的下载安装配置
node.js
LRL_2 天前
【实战指南】Node.js 跨平台依赖下载:如何在 Windows/Linux 环境下互跨下载目标系统的 npm/pnpm 包
linux·windows·node.js
福兮说2 天前
URL 编码的七个坑:c++ 传到后端变空格、%25 套娃、截断 emoji 直接报错
开发语言·前端·javascript·node.js·url
liangshanbo12152 天前
Webpack vs Vite 底层原理高频追问的问题
前端·webpack·node.js
玖石书2 天前
HiSH 通过 apk 安装 Node.js、npm 与 pnpm
npm·node.js·鸿蒙·hish
池塘水悠悠2 天前
nodejs24安装(node.js安装)
node.js
LRL_2 天前
【K8s 存储】Longhorn v1.12.1 离线安装全流程:外网制作离线包 + 内网部署(附踩坑实录)
linux·windows·node.js
Timmy2 天前
前端转全栈笔记:讲框架之前,先把 TypeScript 这关过了
前端·人工智能·node.js