热门标签 | 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 中轻松的调试硬件了。


推荐阅读
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务
    java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务第三步java实现 ... [详细]
  • javascript二叉树基本功能实现
    都是常用的功能。删除是最复杂的。。test ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • 在工作了一年多后,我对现在的工作感到厌倦,没有激情,于是决定转行做程序猿。我在学校开了一个某宝店,通过自己摸索和努力,每个月挣够了零花钱和伙食费。我决定往互联网方向靠,不喜欢面对面和人沟通,而虚拟世界中的开发工作让我感到兴奋。我开始学习Java,感到困惑和怀疑自己的智商,但一篇鸡汤文激发了我学习Python的兴趣,我感到智商找回来了。我相信没有梦想的人和咸鱼没有什么区别。 ... [详细]
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社区 版权所有