首页 > 作文

Node.js中SerialPort(串口)模块使用

更新时间:2023-04-03 22:48:31 阅读: 评论:0

目录
目的模块安装基础使用扫描端口打开端口发送数据接收数据错误处理数据解析器rialport类构造方法属性事件方法命令行工具总结

目的

上位机与各种电路模块间常常采用串口进行通讯,node.js中可以使用rialport模块操作串口,这篇文章将对其使用进行简单说明。

官网:https://rialport.io/
文档:https://rialport.io/docs/
项目地址:https://github.com/rialport/node-rialport

目前rialport模块版本为 9.2.7

模块安装

使用下面命令就可以安装rialport模块:

npm install rialport

rialport模块功能中有部分是用c/c++实现的,所以不同的平台需要该平台可用的二进制文件才能运行,对于常见的平台通常会有预编译好的二进制文件。如果没有的话通常会尝试使用 node-gyp (依赖python 3.x)进行编译,通常包管理器会自动处理相关事务:

有时候或是有些平台下可能需要手动编译。对于编译而言需要平台上有相应的编译工具,可以参考 《node.js入门 02:包管理器npm》 这个文章中的模块编译章节。

安装了编译工具后可以重新安装rialport模块或者手动进行编译处理,具体内容可以参考rialport模块文档中 insta低分上大学lling rialport 章节:https://rialport.io/docs/guide-installation/

基础使用

安装rialport模块后可以使用 const rialport = require('rialport') 方式导入。

扫描端口

使用 rialport.list(): promi<portinfo[]> 静态方法可以获取设备上的串口列表,比如下面演示:

const rialport = require('rialport');rialport.list().then((ports) => {    console.log(ports); // 打印串口列表}).catch((err) => {    console.log(err);});

需要注意的是同一个端口在这个列表中有可能会重复出现。

也可以使用 async / await 方式使用上面方法:

const rialport = require('rialport');(async () => {    try {        let ports = await rialport.list();        console.log(ports); // 打印串口列表    } catch (error) {        console.log(error);    }})();

打开端口

默认情况下创建 rialport 对象就会打开端口,比如下面这样:

const rialport = require('rialport');const port = new rialport('com6', (err) => {    if (err) {        console.log('端口打开失败!');        return;    }    console.1斤等于多少两log('端口打开成功!');});

rialport类的构造方法中有一个 autoopen 选项用于控制创建对象是是否自动打开端口,默认为自动打开,也可以将它关闭,这样可以后面手动进行打开端口动作:

const rialport = require('rialport');const port = new rialport('com6', { autoopen: fal });port.open(function (err) {    if (err) {        console.log('端口打开失败!');        return;    }    console.log('端口打开成功!');});

rialport类的构造方法中可以使用 baudrate 选项设置串口通讯波特率,默认为9600:

const rialport = require('rialport');const port = new rialport('com6', { baudrate: 115200 }); // 设置波特率为115200

更多内容可以参考下面章节rialport类的构造方法说明。

发送数据

可以使用rialport对象的 write 方法发送数据,该方法会将要发送的数据放入发送缓存,然后依次发送,比如下面这样:

const rialport = require('rialport');const port = new rialport('com6');port.write('hello world!\n'); // 发送字符串port.write(buffer.from('hey!\n')); // 发送buffer数据port.write(new uint8array([0x48, 0x69, 0x21, 0x0a])); // 发送字节数组

write 方法也可以添加回调函数:

const rialport = require('rialport');const port = new rialport('com6');port.write('hello world!\n', (err) => {    if (err) {        console.log('write操作失败!');        return;    }    console双11快递.log('write操作成功!');});

需要注意的是上面的回调函数非异常状态下触发的时候只是表示 write 方法本身操作完成,并不代表数据完全从端口发送完成,可以使用 drain 方法来处理,该方法会阻塞直到发送完成:

const rialport = require('rialport');const port = new rialport('com6');port.write('hello world!\n');port.drain(err => {    if (err) return;    console.log('发送完成!');});

接收数据

可以使用下面方式接收数据:

const rialport = require('rialport');const port = new rialport('com6');// 以 paud mode 监听收到的数据,需要主动读取数据port.on('readable', () => {    console.log(port.read()); // 使用read方法读取数据,可以指定读取字节数});// 以 flowing mode 监听收到的数据port.on('data', (data) => {    console.log(data);});

除了上面方式外,也可以使用 pipe 将数据传送到另一个流。

错误处理

rialport对象大多数操作都有回调函数,回调函数中的第一个参数都是异常对象。另外也可以通过 error 事件来统一处理异常:

const rialport = require('rialport');const port = new rialport('com6');port.on('error', err => {    console.log(err);});

数据解析器

rialport模块中准备了一些数据解析器,主要用来处理收到的一些一些常见形式的串口数据,主要提供的功能如下:

bytelength parr
以收到的数据长度为单位进行解析:

const rialport = require('rialport');const port = new rialport('com6');const bytelength = require('@rialport/parr-byte-length');const parr = port.pipe(new bytelength({ length: 8 })); // 每收到8个字节触发parr.on('data', chunk => {    console.log(chunk); // 打印收到的数据});

cctalk parr
解析 cctalk 格式数据,格式详见:https://en.wikipedia.org/wiki/cctalk

delimiter parr
以指定字符为界限处理数据:

const rialport = require('rialport');const port = new rialport('com6');const delimiter = require('@rialport/parr-delimiter');const parr = port.pipe(new delimiter({ delimiter: '\n' })); // 以 \n 分隔处理数据parr.on('data', chunk => {    console.log(chunk.tostrin热火赛程表g()); // 打印收到的数据});

delimiter选项可以是 string|buffer|number[] ;includedelimiter选项表示数据中是否包含分隔符,默认不包含。

interbytetimeout parr
指定时间未收到数据触发解析:

const rialport = require('rialport');const port = new rialport('com6');const interbytetimeout = require('@rialport/parr-inter-byte-timeout');const parr = port.pipe(new interbytetimeout({interval: 2000})); // 2000毫秒未接到数据触发par春夜喜雨的意思r.on('data', chunk => {    console.log(chunk); // 打印收到的数据});

maxbuffersize选项用于指定接收到该数量数据后就算没有超时也将触发动作。

readline parr
以行为单位解析数据,默认行分隔符为 \n,可以使用 delimiter 选项重新设置为其它的,比如 \r\n

ready parr
以开始标志进行解析。

regex parr
以正则表达式为分隔进行解析。

rialport类

使用rialport模块主要就是使用rialport类,其介绍在rialport模块文档中 stream interface 章节:https://rialport.io/docs/api-stream,这里稍微摘录下其中部分内容。

构造方法

new rialport(path [, openoptions] [, opencallback])

构造方法用于创建一个串口对象,path为串口号,opencallback为自动打开失败时的回调函数;

openoptions常用选项如下:

选项类型说明默认值autoopenboolean自动打开端口truebaudratenumber波特率9600databitsnumber数据位,可选值:8、7、6、58highwatermarknumber读和写缓存大小65536lockboolean锁定端口,防止其它平台打开(windows上不支持fal)truestopbitsnumber停止位,可选值:1、21paritystring校验,可选值:none、even、mark、odd、spacenonertsctsboolean流控制设置falxonboolean流控制设置falxoffboolean流控制设置falxanyboolean流控制设置fal

属性

rialport有下面几个属性可读:
pathbaudrateisopenbinding

事件

rialport会触发的事件有下面几个:

open 端口打开时触发;error 发送错误时触发;clo 端口关闭时触发;data 收到数据时触发;drain 如果write方法返回fal,则再次调用write方法时将触发该事件;

方法

rialport可用的一些方法如下:

open(() => {}): void 打开端口;update(options: updateoptions, callback?: err => {}): void 更改波特率;write(data: string|buffer|array<number>, encoding?: string, callback?: error => {}): boolean 发送数据;read(size?: number): string|buffer|null 读取数据;clo(callback?: error => {}): void 关闭端口;t(options: toptions, callback?: error => {}): void 设置流控制;get(callback: (error, data: modemstatus) => {}): void 获取已打开端口的流控制状态;flush(callback? error => {}):void 清空接收和发送缓存中未处理数据;drain(callback? error => {}):void 等待数据发送完成;pau(): this 暂停 flowing mode 触发data事件,转为 paud mode;resume(): this 恢复 data 事件,从 paud mode 转为 flowing mode;

命令行工具

rialport模块也提供了一些命令行工具,用于直接在命令行界面中使用。下面是官网首页的使用演示:

更多内容可以参考rialport模块文档中 command line tools 章节:https://rialport.io/docs/guide-cli

总结

node.js的rialport模块使用主要就是上面一些内容了。

另外需要提一点的是rialport模块并不是直接操作串口,而是调用了各个平台上底层的接口来使用串口,如果有进行相关内容的开发或是有特殊需求的话可以参考rialport模块文档中binding相关内容。

到此这篇关于node.js中rialport(串口)模块使用的文章就介绍到这了,更多相关node.js rialport内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-03 22:47:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/989284ce7840f977de1d835e676d3cf9.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Node.js中SerialPort(串口)模块使用.doc

本文 PDF 下载地址:Node.js中SerialPort(串口)模块使用.pdf

标签:数据   端口   模块   串口
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图