摘要:連接建立成功,就會觸發事件事件稍后再解說。當連接建立時當接收到數據時當出現錯誤時事件監聽,主要用來在合適的時間點發送數據,以及處理接收到來自串口的數據信息。數據會經串口發送至與連接的硬件設備,比如板,或者板等等。
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 中輕松的調試硬件了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89186.html
摘要:定律在那篇最流行的編程語言能做什么里,我們列舉了在不同領域的使用情況,今天讓我們來詳解一下在物聯網中的應用。這個硬件層決定了物聯網應用比應用更加復雜。這時,我開始關注實現物聯網應用的可能性。 凡是能用JavaScript寫出來的,最終都會用JavaScript寫出來。 —— Atwood定律 在那篇《最流行的編程語言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:定律在那篇最流行的編程語言能做什么里,我們列舉了在不同領域的使用情況,今天讓我們來詳解一下在物聯網中的應用。這個硬件層決定了物聯網應用比應用更加復雜。這時,我開始關注實現物聯網應用的可能性。 凡是能用JavaScript寫出來的,最終都會用JavaScript寫出來。 —— Atwood定律 在那篇《最流行的編程語言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:服務器與虛擬主機有什么區別服務器和空虛擬主機的區別在于以下幾點一服務器,也稱伺服器,是提供計算服務的設備,通常指硬件。請問一下,服務器云服務器和虛擬主機有什么區別服務器相當于你獨自擁有的一臺電腦,所有的操作權限你都有。主機和服務器的區別是什么?兩者是包含和被包含的關系,主機是一個統稱,所有服務器都是主機,但并非所有主機都是服務器。主機和服務器的主要差別在于,主機是連接到網絡的計算機或其他設備...
閱讀 1976·2021-11-24 09:38
閱讀 3339·2021-11-22 12:07
閱讀 1903·2021-09-22 16:03
閱讀 1956·2021-09-02 15:41
閱讀 2618·2021-07-24 23:28
閱讀 2211·2019-08-29 13:17
閱讀 1547·2019-08-29 12:25
閱讀 2666·2019-08-29 11:10