当前位置: 首页 > 后端技术 > Node.js

Serialport.js将网络连接到硬件设备编程

时间:2023-04-03 10:56:11 Node.js

Serialport简介想象一个您可以使用JavaScript代码控制榨汁机、电灯、安全系统甚至机器人的世界。嗯,这是一个机器人!是不是觉得很新奇,很兴奋?Serialport库(也称为Node-Serialport,基于Node)为低级串行编码提供必要的steam接口,以控制Arduino芯片组、X10接口、Zigbee无线技术、路标、LCD显示器、收银机抽屉、电机控制器、传感器、叉车、调制解调器、无人机、数控机床、绘图仪、自动售货机、基于ccTalk协议的投币式设备、SMS网关、RFID扫描仪等等。如果你有一个可以异步发送和接收消息的硬件设备(这么说吧),那么物理世界将成为你的玩物。Serialport为JavaScript开发人员打开了硬件开发的大门。这是比编写固件更好的解决方案!获取USB串口路径。PC机一般有2~4个USB接口,以下称为接口端口。不同的操作系统获取的串口信息是不同的。要了解端口信息,可以在命令行工具中输入命令:serialport-list。MacOSX端口是:{comName:'/dev/tty.usbmodem1421',制造商:'Arduino(www.arduino.cc)'}Linux端口是:{comName:'/dev/ttyACM0',制造商:'Arduino(www.arduino.cc).arduino.cc)'}Windows端口为:{comName:'COM3',manufacturer:'ArduinoLLC(www.arduino.cc)'}其中comName字段指的是USB串口的路径。此路径是SerialPort从中实例化的路径。获取串口列表:SerialPort.list([callback])?Promise由于版本历史原因,该接口支持两种调用形式,推荐使用v6.0.0版本的promise方法://的回调形式v4.0.7SerialPort.list((error,ports)=>console.log(ports))//v6.0.0promiseformSerialPort.list().then(ports=>console.log(ports))创建SerialPort对象创建一个SerialPort对象:newSerialPort(path,[options],[openCallback])有了端口路径,就可以创建端口实例并建立连接。letport=newSerialPort('/dev/tty.usbmodem1421');这个实例化是先生成一个端口实例,然后再尝试建立连接。即在实例化过程中存在异步操作。实例化完成后,可能还没有返回连接结果。当连接建立成功后,就会触发open事件——稍后会解释该事件。结合以上两步的代码是:importSerialPortfromserialport;SerialPort.list().then(ports=>{//假设选择第一个串口进行实例化letpath=ports[0].comName;letmyPort=newSerialPort(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板,或者RaspberryPi板等。//直接写入stringmyPort.write('helloworld',(err)=>{if(err)returnconsole.log('writeError:',err.message);})//写入BuffermyPort。write(Buffer.from('helloworld'),callback)写入数据后,会调用上面的回调。如果写入数据出错——可能是非法数据或断线——也会调用上面的回调,但在某些错误情况下,err参数可能不存在。但是肯定会触发错误事件。还没有建立连接,也就是没有触发open事件。如果之前有数据写入,写入操作将被阻塞,直到连接建立。每个串口传输数据都有一定的长度限制。写入一个数据包后,将写入下一个数据包;如果一段数据太长,会分成多个包依次写入。写完后会立即调用drain方法,表示这块数据已经写完了,drain表示把拥塞的数据排掉了。一些安装问题主要是由于一些串口安装不成功,包括Windows系统、Electron(跨平台框架)、部分Linux发行版、树莓派板卡等,都会出现一些安装问题。难以一一呈现,需要耐心谷歌~文末开头提到,Serialport是一个基于Node的JS库,所以上面的代码需要在我们日常的Node环境下运行命令行。但是如果想直接在浏览器中使用,还有很长的路要走。所以,为了更好的服务web开发,这里提供一个我自己封装的npm工具——sensorium-server。只要在命令行打开这个工具,你就可以轻松地建立一个从HTML页面到硬件设备的连接通道。这样就可以很方便的在Browser中调试硬件。