热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Serialport.js连接web和硬件设备编程

Serialport简介想象这样一个世界,在那里你能用JavaScript代码控制榨汁机,灯,安防系统,甚至机器人。嗯,是机器人!你会不会觉得很新奇以致兴奋?Serialport库

Serialport 简介

想象这样一个世界,在那里你能用 Javascript 代码控制榨汁机,灯,安防系统,甚至机器人。嗯,是机器人!你会不会觉得很新奇以致兴奋?

Serialport 库(也称 Node-Serialport,基于 Node),为低级串口编码提供必要的 steam 接口,以控制 Arduino 芯片组,X10 接口,Zigbee 无线技术,公路路标,LCD 显示屏,收银抽屉,电机控制器,传感器,叉车,调制解调器,无人机,数控机床,绘图仪器,自动贩卖机,基于 ccTalk 协议的投币设备,SMS 网关,RFID 扫描器等等非常多设备。如果你手中有一块能够异步收发消息的硬件设备(我们姑且这样说),那么这个物理世界将成为你的掌中玩物。

Serialport 为 Javascript 开发者打开了硬件开发之门。它是一个比编写固件更好的方案!

获取到 USB 串口路径

PC 机一般会带有 2 ~ 4 个 USB 插口, 以下称 port 口。不同的操作系统,获取到的串口信息不同。

欲了解 port 口信息,可以在命令行工具中输入命令:serialport-list

Mac OSX 的 port 口为:

{
comName: '/dev/tty.usbmodem1421',
manufacturer: 'Arduino (www.arduino.cc)'
}

Linux 的 port 口为:

{
comName: '/dev/ttyACM0',
manufacturer: 'Arduino (www.arduino.cc)'
}

Windows 的 port 口为:

{
comName: 'COM3',
manufacturer: 'Arduino LLC (www.arduino.cc)'
}

其中, comName 字段,指的就是 USB 串口的路径。该路径是 SerialPort 实例化的依据。

获取串口列表SerialPort.list([callback]) ⇒ Promise

因历史版本的缘故,该接口支持两种形式调用,推荐 v6.0.0 版本的 promise 方式:

// v4.0.7 的 callback 形式
SerialPort.list((error, ports) => console.log(ports))
// v6.0.0 的 promise 形式
SerialPort.list().then(ports => console.log(ports))

创建一个 SerialPort 对象

创建 SerialPort 对象new SerialPort(path, [options], [openCallback])

有了 port 口路径,就可以创建一个 port 口实例,并建立连接。

let port = new SerialPort('/dev/tty.usbmodem1421');

该实例化是首先产生一个 port 实例,然后再尝试建立连接的。即实例化过程中有一个异步操作,实例化完成了,连接的结果可能还没有返回。

连接建立成功,就会触发 open 事件——事件稍后再解说。

合并以上两步的代码,就是:

import SerialPort from serialport;
SerialPort.list().then( ports => {
// 假设选择第一个串口实例化
let path = ports[0].comName;
let myPort = new SerialPort(path);
})
.catch(err => console.log(err))

绑定事件监听

当获取到了 SerialPort 的实例对象 myPort 后,就可以进行事件监听了。

// 当连接建立时
myPort.on('open', callback);
// 当接收到数据时
myPort.on('data', callback);
// 当出现错误时
myPort.on('error', callback);

事件监听,主要用来在合适的时间点发送数据,以及处理接收到来自串口的数据信息。

值得注意的是,很多错误来自:因串口路径不对导致的连接错误(但此时实例对象已存在)、串口被占用锁定时仍尝试连接的错误。

向串口写入数据

向串口写入数据serialPort.write(data, [encoding], [callback]) ⇒ boolean

实例创建完,并且正确建立连接后,就可以向串口写数据了。数据会经串口发送至与 PC 连接的硬件设备,比如 Arduino 板,或者 Raspberry Pi 板等等。

// 直接写入字符串
myPort.write('hello world', (err) => {
if (err) return console.log('write Error: ', err.message);
})
// 写入 Buffer
myPort.write(Buffer.from('hello world'), callback)

写入数据完毕,就会调用上述回调。

若写数据出错——可能因为数据非法或断开了连接等原因——同样会调用上述回调,只不过有些错误情况下,可能 err 参数不存在。但是 error 事件一定会被触发。

连接未建立,即 open 事件未被触发,若此前就写入数据,写操作会被阻塞,直到建立连接之后再执行。

串口每次传输数据是有一定长度限制的。一个数据包写完,才会开始写下一个数据包;若一条数据太长,会被切分成多个包,依次写入。写完后会立即调用 drain 方法表示本条数据已写完,drain 意为排干了拥塞的数据。

一些安装 trouble

这里主要是 serialport 一些安装不成功的问题,包括 Windows 系统,Electron (跨平台的框架),一些 Linux 发行版以及 Raspberry Pi 板,都有可能发生一些安装的麻烦。 难以一一呈现,需耐心 Google~

文末彩蛋

如开篇说说,Serialport 是基于 Node 的一个 JS 库,那么上述代码需要在 Node 环境中运行,也就是我们日常的命令行。但如果想直接在浏览器中使用,还有一段距离。

所以,为更好的服务于 web 开发,这里有一款本人封装的 npm 工具——sensorium-server,只需在命令行中开启此工具,就可以轻松搭建一个从 HTML 页面到硬件设备的连接通道,这样就可以在 Browser 中轻松的调试硬件了。


推荐阅读
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 利用 JavaScript 和 Node.js 验证时间的有效性
    本文探讨了如何使用 JavaScript 和 Node.js 验证时间的有效性。通过编写一个 `isTime` 函数,我们可以确保输入的时间格式正确且有效。该函数利用正则表达式匹配时间字符串,检查其是否符合常见的日期时间格式,如 `YYYY-MM-DD` 或 `HH:MM:SS`。此外,我们还介绍了如何处理不同时间格式的转换和验证,以提高代码的健壮性和可靠性。 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 优化Vite 1.0至2.0升级过程中遇到的某些代码块过大问题解决方案
    本文详细探讨了在将项目从 Vite 1.0 升级到 2.0 的过程中,如何解决某些代码块过大的问题。通过具体的编码示例,文章提供了全面的解决方案,帮助开发者有效优化打包性能。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 如何撰写初级和高级前端开发者的专业简历
    如何撰写初级和高级前端开发者的专业简历 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 为开发者提供了一系列实用的参考网站和资源链接,包括HTML速查手册( 和 ),帮助开发者快速查找和学习相关技术知识。此外,还涵盖了其他重要的开发工具和文档,为编程工作提供全面支持。 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
author-avatar
栗子丶子兮_481
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有