在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
目的上位机与各种电路模块间常常采用串口进行通讯,Node.js中可以使用SerialPort模块操作串口,这篇文章将对其使用进行简单说明。 官网:https://serialport.io/ 目前SerialPort模块版本为 9.2.7 模块安装使用下面命令就可以安装SerialPort模块: npm install serialport SerialPort模块功能中有部分是用C/C++实现的,所以不同的平台需要该平台可用的二进制文件才能运行,对于常见的平台通常会有预编译好的二进制文件。如果没有的话通常会尝试使用 node-gyp (依赖Python 3.x)进行编译,通常包管理器会自动处理相关事务: 有时候或是有些平台下可能需要手动编译。对于编译而言需要平台上有相应的编译工具,可以参考 《Node.js入门 02:包管理器npm》 这个文章中的模块编译章节。 安装了编译工具后可以重新安装SerialPort模块或者手动进行编译处理,具体内容可以参考SerialPort模块文档中 Installing SerialPort 章节:https://serialport.io/docs/guide-installation/ 基础使用安装SerialPort模块后可以使用 扫描端口使用 const SerialPort = require('serialport'); SerialPort.list().then((ports) => { console.log(ports); // 打印串口列表 }).catch((err) => { console.log(err); }); 需要注意的是同一个端口在这个列表中有可能会重复出现。 也可以使用 async / await 方式使用上面方法: const SerialPort = require('serialport'); (async () => { try { let ports = await SerialPort.list(); console.log(ports); // 打印串口列表 } catch (error) { console.log(error); } })(); 打开端口默认情况下创建 SerialPort 对象就会打开端口,比如下面这样: const SerialPort = require('serialport'); const port = new SerialPort('COM6', (err) => { if (err) { console.log('端口打开失败!'); return; } console.log('端口打开成功!'); }); SerialPort类的构造方法中有一个 autoOpen 选项用于控制创建对象是是否自动打开端口,默认为自动打开,也可以将它关闭,这样可以后面手动进行打开端口动作: const SerialPort = require('serialport'); const port = new SerialPort('COM6', { autoOpen: false }); port.open(function (err) { if (err) { console.log('端口打开失败!'); return; } console.log('端口打开成功!'); }); SerialPort类的构造方法中可以使用 baudRate 选项设置串口通讯波特率,默认为9600: const SerialPort = require('serialport'); const port = new SerialPort('COM6', { baudRate: 115200 }); // 设置波特率为115200 更多内容可以参考下面章节SerialPort类的构造方法说明。 发送数据可以使用SerialPort对象的 const SerialPort = require('serialport'); const port = new SerialPort('COM6'); port.write('Hello world!\n'); // 发送字符串 port.write(Buffer.from('Hey!\n')); // 发送Buffer数据 port.write(new Uint8Array([0x48, 0x69, 0x21, 0x0A])); // 发送字节数组
const SerialPort = require('serialport'); const port = new SerialPort('COM6'); port.write('Hello world!\n', (err) => { if (err) { console.log('write操作失败!'); return; } console.log('write操作成功!'); }); 需要注意的是上面的回调函数非异常状态下触发的时候只是表示 const SerialPort = require('serialport'); const port = new SerialPort('COM6'); port.write('Hello world!\n'); port.drain(err => { if (err) return; console.log('发送完成!'); }); 接收数据可以使用下面方式接收数据: const SerialPort = require('serialport'); const port = new SerialPort('COM6'); // 以 paused mode 监听收到的数据,需要主动读取数据 port.on('readable', () => { console.log(port.read()); // 使用read方法读取数据,可以指定读取字节数 }); // 以 flowing mode 监听收到的数据 port.on('data', (data) => { console.log(data); }); 除了上面方式外,也可以使用 错误处理SerialPort对象大多数操作都有回调函数,回调函数中的第一个参数都是异常对象。另外也可以通过 error 事件来统一处理异常: const SerialPort = require('serialport'); const port = new SerialPort('COM6'); port.on('error', err => { console.log(err); }); 数据解析器SerialPort模块中准备了一些数据解析器,主要用来处理收到的一些一些常见形式的串口数据,主要提供的功能如下: ByteLength Parser const SerialPort = require('serialport'); const port = new SerialPort('COM6'); const ByteLength = require('@serialport/parser-byte-length'); const parser = port.pipe(new ByteLength({ length: 8 })); // 每收到8个字节触发 parser.on('data', chunk => { console.log(chunk); // 打印收到的数据 }); ccTalk Parser Delimiter Parser const SerialPort = require('serialport'); const port = new SerialPort('COM6'); const Delimiter = require('@serialport/parser-delimiter'); const parser = port.pipe(new Delimiter({ delimiter: '\n' })); // 以 \n 分隔处理数据 parser.on('data', chunk => { console.log(chunk.toString()); // 打印收到的数据 }); delimiter选项可以是 string|Buffer|number[] ;includeDelimiter选项表示数据中是否包含分隔符,默认不包含。 InterByteTimeout Parser const SerialPort = require('serialport'); const port = new SerialPort('COM6'); const InterByteTimeout = require('@serialport/parser-inter-byte-timeout'); const parser = port.pipe(new InterByteTimeout({interval: 2000})); // 2000毫秒未接到数据触发 parser.on('data', chunk => { console.log(chunk); // 打印收到的数据 }); maxBufferSize选项用于指定接收到该数量数据后就算没有超时也将触发动作。 Readline Parser Ready Parser Regex Parser SerialPort类使用SerialPort模块主要就是使用SerialPort类,其介绍在SerialPort模块文档中 Stream Interface 章节:https://serialport.io/docs/api-stream,这里稍微摘录下其中部分内容。 构造方法
构造方法用于创建一个串口对象,path为串口号,openCallback为自动打开失败时的回调函数; openOptions常用选项如下:
属性SerialPort有下面几个属性可读: 事件SerialPort会触发的事件有下面几个:
方法SerialPort可用的一些方法如下:
命令行工具SerialPort模块也提供了一些命令行工具,用于直接在命令行界面中使用。下面是官网首页的使用演示: 更多内容可以参考SerialPort模块文档中 Command Line Tools 章节:https://serialport.io/docs/guide-cli 总结Node.js的SerialPort模块使用主要就是上面一些内容了。 另外需要提一点的是SerialPort模块并不是直接操作串口,而是调用了各个平台上底层的接口来使用串口,如果有进行相关内容的开发或是有特殊需求的话可以参考SerialPort模块文档中Binding相关内容。 到此这篇关于Node.js中SerialPort(串口)模块使用的文章就介绍到这了,更多相关Node.js SerialPort内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论