摘要:連接建立成功,就會(huì)觸發(fā)事件事件稍后再解說(shuō)。當(dāng)連接建立時(shí)當(dāng)接收到數(shù)據(jù)時(shí)當(dāng)出現(xiàn)錯(cuò)誤時(shí)事件監(jiān)聽,主要用來(lái)在合適的時(shí)間點(diǎn)發(fā)送數(shù)據(jù),以及處理接收到來(lái)自串口的數(shù)據(jù)信息。數(shù)據(jù)會(huì)經(jīng)串口發(fā)送至與連接的硬件設(shè)備,比如板,或者板等等。
Serialport 簡(jiǎn)介
想象這樣一個(gè)世界,在那里你能用 JavaScript 代碼控制榨汁機(jī),燈,安防系統(tǒng),甚至機(jī)器人。嗯,是機(jī)器人!你會(huì)不會(huì)覺得很新奇以致興奮?
Serialport 庫(kù)(也稱 Node-Serialport,基于 Node),為低級(jí)串口編碼提供必要的 steam 接口,以控制 Arduino 芯片組,X10 接口,Zigbee 無(wú)線技術(shù),公路路標(biāo),LCD 顯示屏,收銀抽屜,電機(jī)控制器,傳感器,叉車,調(diào)制解調(diào)器,無(wú)人機(jī),數(shù)控機(jī)床,繪圖儀器,自動(dòng)販賣機(jī),基于 ccTalk 協(xié)議的投幣設(shè)備,SMS 網(wǎng)關(guān),RFID 掃描器等等非常多設(shè)備。如果你手中有一塊能夠異步收發(fā)消息的硬件設(shè)備(我們姑且這樣說(shuō)),那么這個(gè)物理世界將成為你的掌中玩物。
Serialport 為 JavaScript 開發(fā)者打開了硬件開發(fā)之門。它是一個(gè)比編寫固件更好的方案!
獲取到 USB 串口路徑PC 機(jī)一般會(huì)帶有 2 ~ 4 個(gè) USB 插口, 以下稱 port 口。不同的操作系統(tǒng),獲取到的串口信息不同。
欲了解 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 實(shí)例化的依據(jù)。
獲取串口列表:SerialPort.list([callback]) ? Promise
因歷史版本的緣故,該接口支持兩種形式調(diào)用,推薦 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))創(chuàng)建一個(gè) SerialPort 對(duì)象
創(chuàng)建 SerialPort 對(duì)象: new SerialPort(path, [options], [openCallback])
有了 port 口路徑,就可以創(chuàng)建一個(gè) port 口實(shí)例,并建立連接。
let port = new SerialPort("/dev/tty.usbmodem1421");
該實(shí)例化是首先產(chǎn)生一個(gè) port 實(shí)例,然后再嘗試建立連接的。即實(shí)例化過(guò)程中有一個(gè)異步操作,實(shí)例化完成了,連接的結(jié)果可能還沒有返回。
連接建立成功,就會(huì)觸發(fā) open 事件——事件稍后再解說(shuō)。
合并以上兩步的代碼,就是:
import SerialPort from serialport; SerialPort.list().then( ports => { // 假設(shè)選擇第一個(gè)串口實(shí)例化 let path = ports[0].comName; let myPort = new SerialPort(path); }) .catch(err => console.log(err))綁定事件監(jiān)聽
當(dāng)獲取到了 SerialPort 的實(shí)例對(duì)象 myPort 后,就可以進(jìn)行事件監(jiān)聽了。
// 當(dāng)連接建立時(shí) myPort.on("open", callback); // 當(dāng)接收到數(shù)據(jù)時(shí) myPort.on("data", callback); // 當(dāng)出現(xiàn)錯(cuò)誤時(shí) myPort.on("error", callback);
事件監(jiān)聽,主要用來(lái)在合適的時(shí)間點(diǎn)發(fā)送數(shù)據(jù),以及處理接收到來(lái)自串口的數(shù)據(jù)信息。
值得注意的是,很多錯(cuò)誤來(lái)自:因串口路徑不對(duì)導(dǎo)致的連接錯(cuò)誤(但此時(shí)實(shí)例對(duì)象已存在)、串口被占用鎖定時(shí)仍嘗試連接的錯(cuò)誤。
向串口寫入數(shù)據(jù)向串口寫入數(shù)據(jù):serialPort.write(data, [encoding], [callback]) ? boolean
實(shí)例創(chuàng)建完,并且正確建立連接后,就可以向串口寫數(shù)據(jù)了。數(shù)據(jù)會(huì)經(jīng)串口發(fā)送至與 PC 連接的硬件設(shè)備,比如 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)
寫入數(shù)據(jù)完畢,就會(huì)調(diào)用上述回調(diào)。
若寫數(shù)據(jù)出錯(cuò)——可能因?yàn)閿?shù)據(jù)非法或斷開了連接等原因——同樣會(huì)調(diào)用上述回調(diào),只不過(guò)有些錯(cuò)誤情況下,可能 err 參數(shù)不存在。但是 error 事件一定會(huì)被觸發(fā)。
連接未建立,即 open 事件未被觸發(fā),若此前就寫入數(shù)據(jù),寫操作會(huì)被阻塞,直到建立連接之后再執(zhí)行。
串口每次傳輸數(shù)據(jù)是有一定長(zhǎng)度限制的。一個(gè)數(shù)據(jù)包寫完,才會(huì)開始寫下一個(gè)數(shù)據(jù)包;若一條數(shù)據(jù)太長(zhǎng),會(huì)被切分成多個(gè)包,依次寫入。寫完后會(huì)立即調(diào)用 drain 方法表示本條數(shù)據(jù)已寫完,drain 意為排干了擁塞的數(shù)據(jù)。
一些安裝 trouble這里主要是 serialport 一些安裝不成功的問題,包括 Windows 系統(tǒng),Electron (跨平臺(tái)的框架),一些 Linux 發(fā)行版以及 Raspberry Pi 板,都有可能發(fā)生一些安裝的麻煩。 難以一一呈現(xiàn),需耐心 Google~
文末彩蛋如開篇說(shuō)說(shuō),Serialport 是基于 Node 的一個(gè) JS 庫(kù),那么上述代碼需要在 Node 環(huán)境中運(yùn)行,也就是我們?nèi)粘5拿钚小5绻胫苯釉跒g覽器中使用,還有一段距離。
所以,為更好的服務(wù)于 web 開發(fā),這里有一款本人封裝的 npm 工具——sensorium-server,只需在命令行中開啟此工具,就可以輕松搭建一個(gè)從 HTML 頁(yè)面到硬件設(shè)備的連接通道,這樣就可以在 Browser 中輕松的調(diào)試硬件了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89186.html
摘要:定律在那篇最流行的編程語(yǔ)言能做什么里,我們列舉了在不同領(lǐng)域的使用情況,今天讓我們來(lái)詳解一下在物聯(lián)網(wǎng)中的應(yīng)用。這個(gè)硬件層決定了物聯(lián)網(wǎng)應(yīng)用比應(yīng)用更加復(fù)雜。這時(shí),我開始關(guān)注實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用的可能性。 凡是能用JavaScript寫出來(lái)的,最終都會(huì)用JavaScript寫出來(lái)。 —— Atwood定律 在那篇《最流行的編程語(yǔ)言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:定律在那篇最流行的編程語(yǔ)言能做什么里,我們列舉了在不同領(lǐng)域的使用情況,今天讓我們來(lái)詳解一下在物聯(lián)網(wǎng)中的應(yīng)用。這個(gè)硬件層決定了物聯(lián)網(wǎng)應(yīng)用比應(yīng)用更加復(fù)雜。這時(shí),我開始關(guān)注實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用的可能性。 凡是能用JavaScript寫出來(lái)的,最終都會(huì)用JavaScript寫出來(lái)。 —— Atwood定律 在那篇《最流行的編程語(yǔ)言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:服務(wù)器與虛擬主機(jī)有什么區(qū)別服務(wù)器和空虛擬主機(jī)的區(qū)別在于以下幾點(diǎn)一服務(wù)器,也稱伺服器,是提供計(jì)算服務(wù)的設(shè)備,通常指硬件。請(qǐng)問一下,服務(wù)器云服務(wù)器和虛擬主機(jī)有什么區(qū)別服務(wù)器相當(dāng)于你獨(dú)自擁有的一臺(tái)電腦,所有的操作權(quán)限你都有。主機(jī)和服務(wù)器的區(qū)別是什么??jī)烧呤前捅话年P(guān)系,主機(jī)是一個(gè)統(tǒng)稱,所有服務(wù)器都是主機(jī),但并非所有主機(jī)都是服務(wù)器。主機(jī)和服務(wù)器的主要差別在于,主機(jī)是連接到網(wǎng)絡(luò)的計(jì)算機(jī)或其他設(shè)備...
閱讀 1986·2021-11-24 09:38
閱讀 3346·2021-11-22 12:07
閱讀 1918·2021-09-22 16:03
閱讀 1972·2021-09-02 15:41
閱讀 2630·2021-07-24 23:28
閱讀 2220·2019-08-29 13:17
閱讀 1561·2019-08-29 12:25
閱讀 2675·2019-08-29 11:10