想象这样一个世界,在那里你能用 JavaScript 代码控制榨汁机,灯,安防系统,甚至机器人。嗯,是机器人!你会不会以为很新奇以至兴奋?node
Serialport 库(也称 Node-Serialport,基于 Node),为低级串口编码提供必要的 steam 接口,以控制 Arduino 芯片组,X10 接口,Zigbee 无线技术,公路路标,LCD 显示屏,收银抽屉,电机控制器,传感器,叉车,调制解调器,无人机,数控机床,绘图仪器,自动贩卖机,基于 ccTalk 协议的投币设备,SMS 网关,RFID 扫描器等等很是多设备。若是你手中有一块可以异步收发消息的硬件设备(咱们姑且这样说),那么这个物理世界将成为你的掌中玩物。git
Serialport 为 JavaScript 开发者打开了硬件开发之门。它是一个比编写固件更好的方案!github
PC 机通常会带有 2 ~ 4 个 USB 插口, 如下称 port 口。不一样的操做系统,获取到的串口信息不一样。web
欲了解 port 口信息,能够在命令行工具中输入命令:serialport-list
。npm
Mac OSX 的 port 口为:promise
{ 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 对象: 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
意为排干了拥塞的数据。
这里主要是 serialport
一些安装不成功的问题,包括 Windows 系统,Electron (跨平台的框架),一些 Linux 发行版以及 Raspberry Pi 板,都有可能发生一些安装的麻烦。 难以一一呈现,需耐心 Google~
如开篇说说,Serialport 是基于 Node 的一个 JS 库,那么上述代码须要在 Node 环境中运行,也就是咱们平常的命令行。但若是想直接在浏览器中使用,还有一段距离。
因此,为更好的服务于 web 开发,这里有一款本人封装的 npm 工具——sensorium-server,只需在命令行中开启此工具,就能够轻松搭建一个从 HTML 页面到硬件设备的链接通道,这样就能够在 Browser 中轻松的调试硬件了。