资讯专栏INFORMATION COLUMN

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

myshell / 1157人阅读

摘要:连接建立成功,就会触发事件事件稍后再解说。当连接建立时当接收到数据时当出现错误时事件监听,主要用来在合适的时间点发送数据,以及处理接收到来自串口的数据信息。数据会经串口发送至与连接的硬件设备,比如板,或者板等等。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89186.html

相关文章

  • JavaScript在物联网中的应用

    摘要:定律在那篇最流行的编程语言能做什么里,我们列举了在不同领域的使用情况,今天让我们来详解一下在物联网中的应用。这个硬件层决定了物联网应用比应用更加复杂。这时,我开始关注实现物联网应用的可能性。 凡是能用JavaScript写出来的,最终都会用JavaScript写出来。 —— Atwood定律 在那篇《最流行的编程语言JavaScript能做什么?》里,我们列举了JavaScript在不...

    aaron 评论0 收藏0
  • JavaScript在物联网中的应用

    摘要:定律在那篇最流行的编程语言能做什么里,我们列举了在不同领域的使用情况,今天让我们来详解一下在物联网中的应用。这个硬件层决定了物联网应用比应用更加复杂。这时,我开始关注实现物联网应用的可能性。 凡是能用JavaScript写出来的,最终都会用JavaScript写出来。 —— Atwood定律 在那篇《最流行的编程语言JavaScript能做什么?》里,我们列举了JavaScript在不...

    Barrior 评论0 收藏0
  • 服务器主机有什么区别-主机服务器的区别是什么?

    摘要:服务器与虚拟主机有什么区别服务器和空虚拟主机的区别在于以下几点一服务器,也称伺服器,是提供计算服务的设备,通常指硬件。请问一下,服务器云服务器和虚拟主机有什么区别服务器相当于你独自拥有的一台电脑,所有的操作权限你都有。主机和服务器的区别是什么?两者是包含和被包含的关系,主机是一个统称,所有服务器都是主机,但并非所有主机都是服务器。主机和服务器的主要差别在于,主机是连接到网络的计算机或其他设备...

    xiangchaobin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<