版本號:Serialport@5.0.0-beta3
本文鏈接
想象一個(gè)世界耗美,你可以在那寫javascript來控制攪拌機(jī)辰斋,燈歧譬,安全系統(tǒng)或者甚至是機(jī)器人。是的,我說的是機(jī)器人钳枕。那個(gè)世界就是這兒,現(xiàn)在使用node serialport赏壹。它提供一個(gè)非常簡單的接口所需要的串口程序代碼Arduino 單片機(jī), X10 無線通信模塊, 或者甚至是上升到 Z-Wave 和Zigbee . 在這個(gè)物理世界鱼炒,你可以隨心所欲(The physical world is your oyster with this goodie.)。想完全了解為什么我們做這個(gè)蝌借,請閱讀NodeBots - The Rise of JS Robotics.
為了入門node-serialport昔瞧,我們建議你從下列文章開始:
- Johnny-Five - Johnny-Five 機(jī)器人技術(shù)和物聯(lián)網(wǎng)平臺的六行“helloworld”(太棒了).
- Arduino Node Security Sensor Hacking -一個(gè)關(guān)于“我怎么使用這個(gè)”的文章.
- NodeBots - The Rise of JS Robotics - 一篇調(diào)查文章關(guān)于為什么一個(gè)世界需要在js里編寫機(jī)器人程序以及如何開始。
- 平臺支持
- 安裝說明
- 安裝的平臺環(huán)境
- 協(xié)議
- 使用
-
SerialPort ?
new SerialPort(path, [options], [openCallback])
-
instance
.open([callback])
.update([options], [callback])
-
.write(data, [encoding], [callback])
? <code>boolean</code> -
.read([size])
? <code>string</code> | <code>Buffer</code> | <code>null</code> .close(callback)
.set([options], [callback])
.get([callback])
.flush([callback])
.drain([callback])
-
.pause()
? -
.resume()
? Event: "error"
Event: "open"
Event: "data"
Event: "disconnect"
Event: "close"
-
static
-
.Binding
: <code>BaseBinding</code> -
.parsers
: <code>object</code> -
.list(callback)
: <code>function</code>
-
-
inner
-
~BaseBinding
new BaseBinding(options)
-
instance
-
.open(path, openOptions)
? <code>Promise</code> -
.close()
? <code>Promise</code> -
.read(data, length)
? <code>Promise</code> -
.write(data)
? <code>Promise</code> -
.update([options])
? <code>Promise</code> -
.set([options])
? <code>Promise</code> -
.get()
? <code>Promise</code> -
.flush()
? <code>Promise</code> -
.drain()
? <code>Promise</code>
-
-
static
-
.list()
? <code>Promise</code>
-
-
~errorCallback
: <code>function</code> -
~modemBitsCallback
: <code>function</code> -
~openOptions
: <code>Object</code> -
~listCallback
: <code>function</code>
-
~BaseBinding
- 命令行工具
平臺支持
serialport
支持NodeJS v4 以及更高版本菩佑。0.10和0.12版本使用serialport@4
自晰。serialport
支持的平臺,體系架構(gòu)和nodejs版本可以查看下列表格信息稍坯。
平臺/架構(gòu) | Node v4.x | Node v6.x | Node v7.x |
---|---|---|---|
Linux / ia32 | |||
Linux / x64 | |||
Linux / ARM v61 | |||
Linux / ARM v71 | |||
Linux / ARM v81 | |||
Linux / MIPSel1 | |||
Linux / PPC641 | |||
Windows2 / x86 | |||
Windows2 / x64 | |||
OSX3 / x64 |
1 ARM, MIPSel and PPC641 平臺已知可以運(yùn)行但是不屬于我們的測試范圍或者構(gòu)建矩陣酬荞。 #846 ARM v4 and v5 在 Node v0.10版本之后從Nodejs中取消.
2 Windows 7, 8, 10, and 10 IoT 是支持的但是只有Windows Server 2012 R2 是由我們測試的.
3 OSX 10.4 Tiger 以及更高版本是支持的 但是只有 10.9.5 Mavericks 和 Xcode 6.1 是由我們測試的.
安裝說明
對于大多數(shù)“標(biāo)準(zhǔn)”使用案例(在mac,linux瞧哟,windows x86或者x64上node V4.x)混巧,node-serialport將會很好以及很容易的安裝。
npm install serialport
安裝的平臺環(huán)境
我們使用node-pre-gyp來編譯以及公布大多數(shù)常見使用平臺(linux勤揩,mac咧党,windows在標(biāo)準(zhǔn)的處理器平臺)的二進(jìn)制庫。如果你是特別的平臺陨亡,node-serialport將會工作傍衡,但是當(dāng)你安裝的時(shí)候它將會編譯二進(jìn)制文件。
這假定你有必要讓你可以在自己系統(tǒng)中編譯一些nodejs模塊数苫。這個(gè)或許并非如此聪舒,可是,請確認(rèn)下列對于你系統(tǒng)是正確的虐急,在你提出關(guān)于“無法安裝”的issue之前箱残。對于所有操作系統(tǒng),請確認(rèn)你有安裝了Python 2.x 以及不是3.0止吁,node-gyp(你用來編譯的工具)需要Python 2.x被辑。
Alpine Linux
Alpine 是一個(gè)(非常)小的linux開發(fā)版系統(tǒng), 但是它使用組織標(biāo)準(zhǔn)庫來代替函數(shù)庫 (大多數(shù)開發(fā)版linux系統(tǒng)使用的), 所以他需要編譯。 它通常使用Docker.我們已經(jīng)編譯了可以工作的 apline-node.
# 如果你沒有安裝node/npn敬惦,先添加它們
sudo apk add --no-cache nodejs
# 添加必要的構(gòu)建庫和運(yùn)行依賴
sudo apk add --no-cache make gcc g++ python linux-headers udev
# 然后我們就能安裝 serialport, 強(qiáng)制它編譯
npm install serialport --build-from-source
# 如果你使用root來安裝盼理,你需要使用
Electron
Electron是一個(gè)框架用來創(chuàng)建跨平臺桌面程序。Electron自帶他自己的Node.js運(yùn)行版本
如果你需要serialport
作為一個(gè)Electron項(xiàng)目的依賴俄删,你需要為你用在項(xiàng)目里的Electron項(xiàng)目編譯它宏怔。
當(dāng)你第一次安裝serialport
,它會編譯針對你機(jī)器的Node.js版本的serialport奏路,而不是針對Electron捆綁的Node.js運(yùn)行版本。
再次為Electron編譯serialport
(或者一個(gè)本地模塊)臊诊,你可以使用electron-rebuild
.
1.npm install --save-dev electron-rebuild
2.將electron-rebuild
加入到你項(xiàng)目中的package.json的安裝鉤子鸽粉。
3.運(yùn)行npm install
更多關(guān)于electron-rebuild
的信息訪問README.
查看實(shí)例項(xiàng)目可查看electron-serialport
.
非法指令
假定一個(gè)完全有能力的芯片預(yù)編譯的二進(jìn)制文件。例如Galileo2缺乏一些ia32
指令集架構(gòu)抓艳。一些其他平臺有相似的問題触机。所以當(dāng)你試圖運(yùn)行serialport時(shí),如果你得到非法指令
玷或,你將需要重新構(gòu)建serialport二進(jìn)制文件通過告知npm去重新構(gòu)建它儡首。
#告知npm構(gòu)建serialport在安裝的時(shí)間內(nèi)
npm install serialport --build-from-source
#如果你有一個(gè)依賴serialport的包,你可以告知npm去特別重新構(gòu)建它偏友。
npm rebuild serialport --build-from-source
#或者除去包名蔬胯,重新構(gòu)建所有
npm rebuild --build-from-source
Mac OS X
確定你有是在最低的xCode命令行工具里安裝適用你系統(tǒng)的配置。如果你最近更新了系統(tǒng)约谈,可能會移除你安裝的命令行工具笔宿,請?jiān)谔峤粏栴}前仔細(xì)查證。你需要使用g++ v4.8或者更高版本來編譯Node.js 4.x+的node-serialport
棱诱。
Raspberry Pi Linux
下列是關(guān)于使用Johnny-Five和Raspi IO設(shè)置樹莓派的說明泼橘。這些項(xiàng)目使用Node Serialport。
Revision | CPU | Arm Version |
---|---|---|
A, A+, B, B+ | 32-bit ARM1176JZF-S | ARMv6 |
Compute Module | 32-bit ARM1176JZF-S | ARMv6 |
Zero | 32-bit ARM1176JZF-S | ARMv6 |
B2 | 32-bit ARM Cortex-A7 | ARMv7 |
B3 | 32-bit ARM Cortex-A53 | ARMv8 |
sudo / root
如果你準(zhǔn)備使用sudo
或者root權(quán)限去安裝node Serialport迈勋,npm
需要你使用不安全的參數(shù)標(biāo)志炬灭。這個(gè)需求一般很少需要。
sudo npm install serialport --unsafe-perm --build-form-source
使用標(biāo)志失敗導(dǎo)致類似的錯誤如下靡菇;
root@rpi3:~# npm install -g serialport
/usr/bin/serialport-list -> /usr/lib/node_modules/serialport/bin/serialport-list.js
/usr/bin/serialport-term -> /usr/lib/node_modules/serialport/bin/serialport-terminal.js
> serialport@4.0.3 install /usr/lib/node_modules/serialport
> node-pre-gyp install --fallback-to-build
gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/.node-gyp/6.9.1"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/lib/node_modules/serialport/.node-gyp"
make: Entering directory '/usr/lib/node_modules/serialport/build'
make: *** No rule to make target '../.node-gyp/6.9.1/include/node/common.gypi', needed by 'Makefile'. Stop.
make: Leaving directory '/usr/lib/node_modules/serialport/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
Ubuntu/Debian Linux
最好的方式來安裝任何版本的NodeJS是使用NodeSource Node.js Binary Distributions.舊版本的Ubuntu安裝錯誤的nodejs版本和二進(jìn)制名稱重归。如果你node二進(jìn)制文件是nodejs
不是node
或者如果你的nodejs版本是v0.10.29
,那么你應(yīng)該根據(jù)以下這個(gè)說明來操作厦凤。
build-essential
包是編譯serialport
必要的包鼻吮。如果那兒有一個(gè)你不需要的你平臺的二進(jìn)制文件,請繼續(xù)较鼓!
#Using Ubuntu and node 6
curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install -y nodejs
#Using Debian and node 6,使用root權(quán)限
curl -sL https://deb.nodesource.com/setup_7.x | bash -
apt-get install -y nodejs
Windows
Windows 7,Windows 8.1,Windows 10和Windows 10 IoT是支持的椎木。預(yù)編譯二進(jìn)制文件是可用的,但是如果你想要從源碼構(gòu)建它的話博烂,你需要查看node-gyp 的安裝的說明香椎。一旦這些都完成了并且可以工作了你將能從源碼來安裝serialport。
npm install serialport --build-from-source
這不是node-gyp說明的一部分禽篱,但是有些時(shí)候它會幫助你畜伐,如果你在visual studio創(chuàng)建了一個(gè)c++項(xiàng)目,它將會安裝那些在兩個(gè)小時(shí)安裝visual studio過程中不能安裝的必要的組件躺率,而你只能坐在那兒玛界。這個(gè)將解決一些Failed to locate:"CL.exe"
的實(shí)例万矾。
協(xié)議
SerialPort 使用的是MIT協(xié)議以及它所有的依賴關(guān)系都是遵循MIT或者BSD協(xié)議。
使用
打開一個(gè)串口:
var SerialPort = require('serialport');
var port = new SerialPort('/dev/tty-usbserial1',{
baudRate: 57600
});
當(dāng)打開一個(gè)串口慎框,你可以指定(按這個(gè)順序)
1.串口的路徑 - 需要
2.選項(xiàng) - 可選的勤众,下面會描述
打開一個(gè)串口
構(gòu)造一個(gè)SerialPort
項(xiàng)目將會立即打開一個(gè)串口。當(dāng)你可以在任何時(shí)候能讀出和寫入(它會在打開的串口中排列)鲤脏,大多數(shù)串口函數(shù)要求一個(gè)開啟的串口。當(dāng)串口是打開的時(shí)候吕朵,你可以使用以下三個(gè)方式調(diào)用代碼猎醇。
-
open
事件經(jīng)常會觸發(fā)當(dāng)串口打開的時(shí)候。 當(dāng)autoOpen
選項(xiàng)沒有失效的時(shí)候努溃,構(gòu)造函數(shù)的 openCallback - 被傳遞給
.open()
硫嘶。如果你已經(jīng)將它關(guān)閉,callback回調(diào)會被忽視梧税。 -
.open()
函數(shù)需要一個(gè)在串口打開后的回調(diào)沦疾。如果你關(guān)閉了autoOpen
選項(xiàng)或者已經(jīng)關(guān)閉了串口,這個(gè)就可以被使用第队。
var SerialPort = require('serialport');
var port = new SerialPort('/dev/tty-usbserial1');
port.on('open',function(){
port.write('main screen turn on ',function(err){
if(err){
return console.log('Error on write: ' ,err.message);
}
console.log('message written');
});
});
//打開錯誤將會發(fā)出一個(gè)錯誤事件
port.on('error',function(err){
console.log('Error: ',err.message);
});
這個(gè)可以被移動到構(gòu)造函數(shù)的回調(diào)
var SerialPort = require('serialport');
var port = new SerialPort('/dev/tty-usbserial1',function(err){
if(err){
return console.log('Error:',err.message);
}
port.write('main screen turn on',function(err){
if(err){
return console.log('Error on write: ',err.message);
}
console.log('message written');
});
});
當(dāng)關(guān)閉autoOpen
選項(xiàng)哮塞,你將要自己打開串口。
var SerialPort = require('serialport');
var port = new SerialPort('/dev/tty-usbserial1',{autoOpen:false});
port.open(function(err){
if(err){
return console.log('Error opening port: ',err.message);
}
//寫入失敗將會被串口發(fā)出由于沒有寫回調(diào)凳谦。
port.write('main screen turn on');
});
//開啟事件總是會被發(fā)出
port.on('open',function(){
//打開的邏輯
});
你可以從下列串口更新新的數(shù)據(jù)
port.on('data',function(data){
console.log('Data: '+data);
});
你可以通過發(fā)送一個(gè)字符串或者緩沖給寫入方法來向串口寫入數(shù)據(jù)忆畅。像下列一樣:
port.write('Hi Mon!');
port.write(new Buffer('Hi Mom!'));
享受以及使用這些代碼做一些酷的事情吧!
調(diào)試
我們使用debug 包以及記錄下serialport
的命名空間尸执。我們的日志家凯;
-
serialport:main
對于所有高等級的主要日志 -
serialport:binding
對于所有低級的日志
你可以通過環(huán)境變量來應(yīng)用日志。檢查debug文檔給更多的信息如失。
DEBUG=serialport:main node myapp.js
DEBUG=serialport:* node myapp.js
DEBUG=* node myapp.js
錯誤處理
所有函數(shù)在SerialPort的兩個(gè)約定绊诲。
- 參數(shù)錯誤拋出一個(gè)
TypeError
對象。當(dāng)這些函數(shù)被叫做無效參數(shù)時(shí)褪贵,你將會看見這些掂之。 - 如果沒有回調(diào)被提供,運(yùn)行時(shí)錯誤提供
Error
對象給函數(shù)回調(diào)或者發(fā)出一個(gè)error event
竭鞍。你將會看到這些當(dāng)一個(gè)運(yùn)行錯誤發(fā)生板惑,比如試圖開啟一個(gè)錯誤的串口,或者設(shè)置一個(gè)不支持的波特率偎快。
如果你調(diào)用正確參數(shù)的函數(shù)冯乘,它應(yīng)該不需要在一個(gè)try/catch結(jié)構(gòu)中包括一個(gè)SerialPort對象
<a name="exp_module_serialport--SerialPort"></a>
SerialPort ?
Kind: 輸出類
Kind: Exported class
Emits: <code>open</code>, <code>data</code>, <code>close</code>, <code>error</code>, <code>disconnect</code>
Properties
Name | Type | Description |
---|---|---|
baudRate | <code>number</code> | 串口的波特率,使用.update 來改變它晒夹。只讀 |
binding | <code>object</code> | 支持串口的綁定對象裆馒,只讀. |
isOpen | <code>boolean</code> | 如果串口打開時(shí)為true 姊氓,其他情況是 false .只讀. (since 5.0.0 ) |
path | <code>string</code> | 串口的系統(tǒng)路徑或者名稱. 只讀. |
<a name="new_module_serialport--SerialPort_new"></a>
new SerialPort(path,[options],[openCallback])
為path
創(chuàng)建一個(gè)新的串口對象.用無效的參數(shù)或者無效的選項(xiàng)構(gòu)造一個(gè)新的串口時(shí),會拋出錯誤喷好。串口將默認(rèn)自動打開翔横,其次這相當(dāng)于調(diào)用port.open(openCallback)
。這個(gè)可以被關(guān)閉梗搅,通過設(shè)置autoOpen
選項(xiàng)為false禾唁。
Throws:
- <code>TypeError</code> 當(dāng)提供無效參數(shù)時(shí), 將會拋出TypeError无切。
參數(shù) | 類型 | 描述 |
---|---|---|
path | <code>string</code> | 串口打開的系統(tǒng)路徑.例如, 在Mac/Linux上/dev/tty.XXX 或者 Windows上的 COM1 . |
[options] | <code>openOptions</code> | 串口配置選項(xiàng) |
[openCallback] | <code>errorCallback</code> | 當(dāng)連接已經(jīng)打開. 如果它沒有提供以及由錯誤發(fā)生荡短,它將會發(fā)出串口error 事件。如果在openOptions中autoOpen被設(shè)置為false哆键,回調(diào)將不會調(diào)用 |
<a name="module_serialport--SerialPort+open"></a>
serialPort.open([callback])
打開一個(gè)連接到串口
Kind:實(shí)例方法 <code>SerialPort</code>
Emits:<code>open</code>
參數(shù) | 類型 | 描述 |
---|---|---|
[callback] | <code>errorCallback</code> | 當(dāng)連接已經(jīng)被打開. 如果它沒有被提供以及有一個(gè)錯誤發(fā)生, 它將在串口上被發(fā)出error 事件``. |
<a name="module_serialport--SerialPort+update"></a>
serialPort.update([options],[callback])
改變打開的串口的波特率掘托。拋出異常如果你提供了一個(gè)錯誤的參數(shù)。當(dāng)波特率不支持事籍嘹,會拋出錯誤或者產(chǎn)生回調(diào)闪盔。
Kind: instance method of <code>SerialPort</code>
參數(shù) | 類型 | 描述 |
---|---|---|
[options] | <code>object</code> | 目前只有波特率是支持的 |
[options.baudRate] | <code>number</code> | 設(shè)置波特率的串口是打開的。這應(yīng)該匹配常見的波特率之一, 比如 110, 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200. 當(dāng)然不能擔(dān)保, 串口連接的設(shè)備將支持請求的波特率,只要串口自己支持那個(gè)波特率. |
[callback] | <code>errorCallback</code> | 當(dāng)波特率被改變的時(shí)候. 如果 .update 被調(diào)用而沒有回調(diào)以及有一個(gè)錯誤,錯誤事件將會被觸發(fā)辱士。 |
<a name="module_serialport--SerialPort+write"></a>
serialPort.write(data,[encoding],[callback])
? <code>boolean</code>
向給定的串口寫入數(shù)據(jù)泪掀。如果端口沒有打開,會緩存寫入數(shù)據(jù)颂碘。
寫入操作是無阻塞的族淮。當(dāng)它返回時(shí),數(shù)據(jù)或許還沒有被寫入串口凭涂∽@保看drain()
一些設(shè)備,比如當(dāng)你打開一個(gè)連接到Arduino時(shí)切油,它會重啟蝙斜。在這種情況下,如果你立刻向設(shè)備寫入澎胡,它們將不能接收到數(shù)據(jù)孕荠。這經(jīng)常在Arduino發(fā)送“ready”字節(jié)后工作,你的node程序會在寫入前等待攻谁。你也可以僥幸認(rèn)為等待大概400ms.
盡管串口是一個(gè)流稚伍,但當(dāng)寫入它可以接受的字節(jié)數(shù)組除了字符串和緩存時(shí),這個(gè)格外的功能非常有用戚宦。
Kind: 實(shí)例方法 <code>SerialPort</code>
Returns: <code>boolean</code> - 如果流渴望在繼續(xù)寫入其他數(shù)據(jù)之前調(diào)用代碼等待被觸發(fā)的drain
事件个曙,就是false
; 其他情況是 true
.
Since: 5.0.0
參數(shù) | 類型 | 描述 | ||
---|---|---|---|---|
data | <code>string</code> | <code>array</code> | <code>buffer</code> | 接收一個(gè) Buffer 對象, 或者一個(gè)接受buffer 構(gòu)造函數(shù)的類型 (除了字節(jié)數(shù)組或者一個(gè)字符串). |
[encoding] | <code>string</code> | 編碼, 如果數(shù)據(jù)塊是一個(gè)字符串. 默認(rèn)的是 'utf8' . 也接受 'ascii' , 'base64' , 'binary' , 'hex' 查看 Buffers and Character Encodings了解所有可用的選項(xiàng). |
||
[callback] | <code>function</code> | 第一次寫入操作結(jié)束.數(shù)據(jù)可能還沒有刷新到底層端口,沒有參數(shù). |
<a name="module_serialport--SerialPort+read"></a>
serialPort.read([size])
? <code>string</code> | <code>Buffer</code> | <code>null</code>
從串口請求一個(gè)字節(jié)數(shù).read()
方法從內(nèi)存緩沖區(qū)拉取一些數(shù)據(jù)然后返回它。如果沒有可用數(shù)據(jù)被讀取受楼,會返回null垦搬。默認(rèn)的呼寸,數(shù)據(jù)將會被返回成一個(gè)緩存對象,除非一個(gè)編碼已經(jīng)指明使用了.setEncoding()
方法猴贰。
Kind: 實(shí)例方法 <code>SerialPort</code>
Returns: <code>string</code> | <code>Buffer</code> | <code>null</code> - 內(nèi)存緩沖區(qū)數(shù)據(jù)
Since: 5.0.0
參數(shù) | 類型 | 描述 |
---|---|---|
[size] | <code>number</code> | 指明了會返回多少字節(jié)的數(shù)據(jù)如果是可用的話对雪。 |
<a name="module_serialport--SerialPort+close"></a>
serialPort.close(callback)
關(guān)閉開啟的連接
Kind: 實(shí)例方法 <code>SerialPort</code>
Emits: <code>close</code>
參數(shù) | 類型 | 描述 |
---|---|---|
callback | <code>errorCallback</code> | 當(dāng)連接被關(guān)閉. |
<a name="module_serialport--SerialPort+set"></a>
serialPort.set([options], [callback])
在打開的串口上設(shè)置控制標(biāo)志. Uses SetCommMask
for windows and ioctl
for mac and linux.
Kind:實(shí)例方法 <code>SerialPort</code>
Since: 5.0.0
參數(shù) | 類型 | 默認(rèn)值 | 描述 |
---|---|---|---|
[options] | <code>object</code> | 所有選項(xiàng)是操作系統(tǒng)默認(rèn)的當(dāng)串口被打開. 每個(gè)標(biāo)志被設(shè)置為相同的調(diào)用提供或者是默認(rèn)數(shù)據(jù).如果選項(xiàng)沒有提供將要使用的默認(rèn)選項(xiàng). | |
[options.brk] | <code>Boolean</code> | <code>false</code> | |
[options.cts] | <code>Boolean</code> | <code>false</code> | |
[options.dsr] | <code>Boolean</code> | <code>false</code> | |
[options.dtr] | <code>Boolean</code> | <code>true</code> | |
[options.rts] | <code>Boolean</code> | <code>true</code> | |
[callback] | <code>errorCallback</code> | 當(dāng)串口標(biāo)志被設(shè)置. |
<a name="module_serialport--SerialPort+get"></a>
serialPort.get([callback])
返回控制標(biāo)志 (CTS, DSR, DCD)在開啟的串口上.
使用GetCommModemStatus
for windows and ioctl
for mac and linux.
Kind: 實(shí)例方法 <code>SerialPort</code>
參數(shù) | 類型 | 描述 |
---|---|---|
[callback] | <code>modemBitsCallback</code> | Called once the modem bits have been retrieved(當(dāng)比特被恢復(fù)) |
<a name="module_serialport--SerialPort+flush"></a>
serialPort.flush([callback])
刷新收到的丟棄的數(shù)據(jù),但是不讀出和寫入米绕,也不傳輸瑟捣。. 更多的詳細(xì)技術(shù)請看 tcflush(fd, TCIFLUSH)
for Mac/Linux and FlushFileBuffers
for Windows.
Kind: 實(shí)例方法 <code>SerialPort</code>
參數(shù) | 類型 | 描述 |
---|---|---|
[callback] | <code>errorCallback</code> | 當(dāng)刷新操作完成. |
<a name="module_serialport--SerialPort+drain"></a>
serialPort.drain([callback])
等待直到所有發(fā)出的數(shù)據(jù)被傳輸?shù)酱凇?查看 tcdrain()
or FlushFileBuffers() 了解更多信息。
Kind: 實(shí)例方法 <code>SerialPort</code>
參數(shù) | 類型 | 描述 |
---|---|---|
[callback] | <code>errorCallback</code> | 當(dāng)耗盡操作返回 |
Example
寫入 data
以及等待直到在調(diào)用回調(diào)之前栅干,結(jié)束對目標(biāo)串口的傳輸蝶柿。
function writeAndDrain (data, callback) {
sp.write(data, function () {
sp.drain(callback);
});
}
<a name="module_serialport--SerialPort+pause"></a>
serialPort.pause()
?
pause()
方法會導(dǎo)致一個(gè)流的流動模式停止觸發(fā)'data'事件,切換的流動模式. 任何可用的數(shù)據(jù)將仍然存放在內(nèi)存緩存區(qū)非驮。
Kind: 實(shí)例方法<code>SerialPort</code>
Returns: this
See: module:serialport#resume
Since: 5.0.0
<a name="module_serialport--SerialPort+resume"></a>
serialPort.resume()
?
resume()
會導(dǎo)致一個(gè)明確的暫停可讀的流雏赦,來恢復(fù)觸發(fā)的‘data'事件鳖链,切換流到流模式
Kind: 實(shí)例方法 <code>SerialPort</code>
Returns: this
See: module:serialport#pause
Since: 5.0.0
<a name="module_serialport--SerialPort+event_error"></a>
Event: "error"
無論何時(shí)這有一個(gè)錯誤就會回調(diào)error
事件莲组。
Kind: 事件由此觸發(fā) <code>SerialPort</code>
<a name="module_serialport--SerialPort+event_open"></a>
Event: "open"
當(dāng)串口打開以及準(zhǔn)備進(jìn)行寫入時(shí),open
事件將會無參回調(diào)。 如果碰巧如果你有構(gòu)造函數(shù)立即打開或者如果你通過open()
手動打開串口绝骚。查看 Useage/Opening a Port 了解更多信息.
Kind: 事件由此觸發(fā) <code>SerialPort</code>
<a name="module_serialport--SerialPort+event_data"></a>
Event: "data"
data
事件輸出字符串到串口在流動模式中. 一旦被接受到,數(shù)據(jù)就會被發(fā)出茂腥。 數(shù)據(jù)將會是一個(gè)緩存對象井联,很多不同的數(shù)據(jù)量在其中.readLine
解析器將數(shù)據(jù)轉(zhuǎn)換成字符串.查看 parsers部分了解關(guān)于解析器的更多信息以及 NodeJS stream documentation 了解更多關(guān)于數(shù)據(jù)事件的信息.
Kind: 事件由此觸發(fā) <code>SerialPort</code>
<a name="module_serialport--SerialPort+event_disconnect"></a>
Event: "disconnect"
disconnect
事件回調(diào)會調(diào)用一個(gè)錯誤對象. 這個(gè)經(jīng)常發(fā)生在 close
事件之前如果斷開連接被發(fā)現(xiàn)。
Kind: 事件由此觸發(fā)<code>SerialPort</code>
<a name="module_serialport--SerialPort+event_close"></a>
Event: "close"
close
事件是無參回調(diào)當(dāng)串口被關(guān)閉時(shí). 當(dāng)一個(gè)錯誤發(fā)生寥掐,錯誤事件將被觸發(fā)靴寂。
Kind: 事件由此觸發(fā) <code>SerialPort</code>
<a name="module_serialport--SerialPort.Binding"></a>
SerialPort.Binding
: <code>BaseBinding</code>
Binding是node Serialport底層的系統(tǒng). 默認(rèn)的我們自動檢測 windows, Linux 和 OSX系統(tǒng) 以及為你系統(tǒng)加載合適的模塊. 你可以指定 SerialPort.Binding
去綁定任何你喜歡的后臺. 你可以搜索更多信息從 npm.
你也可以禁止自動后臺加載,通過一下代碼實(shí)現(xiàn)
var SerialPort = require('serialport/lib/serialport');
SerialPort.Binding = MyBindingClass;
Kind: 靜態(tài)性能<code>SerialPort</code>
Since: 5.0.0
<a name="module_serialport--SerialPort.parsers"></a>
SerialPort.parsers
: <code>object</code>
默認(rèn)的分析程序是Transform streams 可以用各種各樣的方式來解析數(shù)據(jù)召耘,可以被使用來處理傳入的數(shù)據(jù)百炬。
使用各種解析程序你都需要創(chuàng)建他們?nèi)缓筝斔蚐erialPort到解析程序。千萬別編寫解析程序污它,而是編寫SerialPort對象剖踊。
Kind: 靜態(tài)特性<code>SerialPort</code>
Since: 5.0.0
Properties
名稱 | 狀態(tài) | 描述 |
---|---|---|
ByteLength | <code>Class</code> | 發(fā)出數(shù)據(jù)的轉(zhuǎn)換流作為緩存,在收到一個(gè)特定的字節(jié)數(shù)后 |
Delimiter | <code>Class</code> | 發(fā)出數(shù)據(jù)的轉(zhuǎn)換流衫贬,每次接受一個(gè)字節(jié)序列 |
Readline | <code>Class</code> | 發(fā)出數(shù)據(jù)的轉(zhuǎn)換流德澈,在收到一個(gè)換行符之后 |
例子
var SerialPort = require('serialport');
var Readline = SerialPort.parsers.Readline;
var port = new SerialPort('/dev/tty-usbserial1');
var parser = new Readline();
port.pipe(parser);
parser.on('data', console.log);
port.write('ROBOT PLEASE RESPOND\n');
// 可以縮短創(chuàng)建的解析程序和傳輸管道
var parser = port.pipe(new Readline());
使用字節(jié)長度解析器,你必須提供字節(jié)數(shù)的長度:
var SerialPort = require('serialport');
var ByteLength = SerialPort.parsers.ByteLength
var port = new SerialPort('/dev/tty-usbserial1');
var parser = port.pipe(new ByteLength({length: 8}));
parser.on('data', console.log);
使用分隔符解析器你必須指明分隔符固惯,你必須在一個(gè)字符串梆造、緩存或者一個(gè)字節(jié)數(shù)組中提供一個(gè)分隔符:
var SerialPort = require('serialport');
var Delimiter = SerialPort.parsers.Delimiter;
var port = new SerialPort('/dev/tty-usbserial1');
var parser = port.pipe(new Delimiter({delimiter: new Buffer('EOL')}));
parser.on('data', console.log);
使用換行符解析器,你必須提供一個(gè)分隔符 (默認(rèn)是 '\n')
var SerialPort = require('serialport');
var Readline = SerialPort.parsers.Readline;
var port = new SerialPort('/dev/tty-usbserial1');
var parser = port.pipe(Readline({delimiter: '\r\n'}));
parser.on('data', console.log);
<a name="module_serialport--SerialPort.list"></a>
SerialPort.list(callback)
: <code>function</code>
從元數(shù)據(jù)中找回可用的串口列表. 只有“串口名”是可用的,所有其他的字段如果它們不可用葬毫,將會無意義澳窑。 串口名
也是一個(gè)路徑或者一個(gè)標(biāo)識符(例如 COM1
)用來打開串口.
Kind: 靜態(tài)方法 <code>SerialPort</code>
參數(shù) | 類型 |
---|---|
callback | <code>listCallback</code> |
例子
// 示例的串口信息
{
comName: '/dev/cu.usbmodem1421',
manufacturer: 'Arduino (www.arduino.cc)',
serialNumber: '757533138333964011C1',
pnpId: undefined,
locationId: '0x14200000',
vendorId: '0x2341',
productId: '0x0043'
}
var SerialPort = require('serialport');
SerialPort.list(function (err, ports) {
ports.forEach(function(port) {
console.log(port.comName);
console.log(port.pnpId);
console.log(port.manufacturer);
});
});
<a name="module_serialport--SerialPort..BaseBinding"></a>
SerialPort~BaseBinding
你永遠(yuǎn)不能直接使用Binding對象斧散,因?yàn)樗鼈兺ㄟ^SerialPort來接觸底層硬件. 這個(gè)文檔是針對綁定不同平臺的用戶.這個(gè)類能被繼承來為每個(gè)方法進(jìn)行類型檢查.
Kind: 內(nèi)部類 <code>SerialPort</code>
Since: 5.0.0
Properties
名稱 | 類型 | 描述 |
---|---|---|
isOpen | <code>boolean</code> | 必須的屬性. 串口打開就是true , 其他的是false .只讀. |
-
~BaseBinding
new BaseBinding(options)
-
instance
-
.open(path, openOptions)
? <code>Promise</code> -
.close()
? <code>Promise</code> -
.read(data, length)
? <code>Promise</code> -
.write(data)
? <code>Promise</code> -
.update([options])
? <code>Promise</code> -
.set([options])
? <code>Promise</code> -
.get()
? <code>Promise</code> -
.flush()
? <code>Promise</code> -
.drain()
? <code>Promise</code>
-
-
static
-
.list()
? <code>Promise</code>
-
<a name="new_module_serialport--SerialPort..BaseBinding_new"></a>
new BaseBinding(options)
Throws:
- <code>TypeError</code> 當(dāng)給定一個(gè)無效的參數(shù),將會拋出TypeError錯誤.
參數(shù) | 類型 | 描述 |
---|---|---|
options | <code>object</code> | |
options.disconnect | <code>function</code> | 當(dāng)binding被檢測到一個(gè)沒連接的串口摊聋,方法將會被調(diào)用. 這個(gè)方法應(yīng)該在所有操作期間調(diào)用鸡捐,而不是在操作正常回調(diào)后調(diào)用麻裁。SerialPort 將試圖調(diào)用 close 在斷開連接后箍镜,以及會忽視所有錯誤. |
<a name="module_serialport--SerialPort..BaseBinding+open"></a>
baseBinding.open(path, openOptions)
? <code>Promise</code>
通過路徑打開一個(gè)引用的串口連接
Kind: 實(shí)例方法<code>BaseBinding</code>
Returns: <code>Promise</code> - 在串口打開和配置好后返回解決.
Throws:
- <code>TypeError</code> 當(dāng)給定一個(gè)無效的參數(shù),將會拋出TypeError錯誤.
參數(shù) | 類型 |
---|---|
path | <code>string</code> |
openOptions | <code>openOptions</code> |
<a name="module_serialport--SerialPort..BaseBinding+close"></a>
baseBinding.close()
? <code>Promise</code>
關(guān)閉一個(gè)串口連接
Kind: 實(shí)例方法 <code>BaseBinding</code>
Returns: <code>Promise</code> - 一旦串口被關(guān)閉返回解決.
Throws:
- <code>TypeError</code> 當(dāng)給定一個(gè)無效的參數(shù)煎源,將會拋出TypeError錯誤.
<a name="module_serialport--SerialPort..BaseBinding+read"></a>
baseBinding.read(data, length)
? <code>Promise</code>
從SerialPort請求一個(gè)字節(jié)數(shù)色迂。這個(gè)方法和node的 fs.read
相似.
Kind: 實(shí)例方法 <code>BaseBinding</code>
Returns: <code>Promise</code> -在閱讀操作結(jié)束之后返回讀取的字節(jié)數(shù).
Throws:
- <code>TypeError</code>當(dāng)給定一個(gè)無效的參數(shù),將會拋出TypeError錯誤.
Params: <code>integer</code> 偏移 - 在緩存區(qū)偏移處開始寫入.
參數(shù) | 類型 | 描述 |
---|---|---|
data | <code>buffer</code> | 接受 Buffer 對象 |
length | <code>integer</code> | 讀取指定的最大字節(jié)數(shù) |
<a name="module_serialport--SerialPort..BaseBinding+write"></a>
baseBinding.write(data)
? <code>Promise</code>
向SerialPort寫入一個(gè)字節(jié)數(shù)手销,這將只能在沒有等待寫入的操作時(shí)被調(diào)用.
Kind: 實(shí)例方法 <code>BaseBinding</code>
Returns: <code>Promise</code> - 在數(shù)據(jù)傳遞給操作系統(tǒng)編寫后返回.
Throws:
- <code>TypeError</code> 當(dāng)給定一個(gè)無效的參數(shù)歇僧,將會拋出TypeError錯誤.
參數(shù) | 類型 | 描述 |
---|---|---|
data | <code>buffer</code> | 接受 Buffer 對象. |
<a name="module_serialport--SerialPort..BaseBinding+update"></a>
baseBinding.update([options])
? <code>Promise</code>
改變開啟的串口的連接設(shè)置。當(dāng)前只能設(shè)置波特率锋拖。
Kind: 實(shí)例方法 <code>BaseBinding</code>
Returns: <code>Promise</code> - 當(dāng)串口波特率被改變后返回.
Throws:
- <code>TypeError</code> 當(dāng)給定一個(gè)無效的參數(shù)诈悍,將會拋出TypeError錯誤.
參數(shù) | 類型 | 描述 |
---|---|---|
[options] | <code>object</code> | 目前只有波特率 支持 |
[options.baudRate] | <code>number</code> | 如果通過bingdings提供一個(gè)不支持的波特率,它將回調(diào)一個(gè)錯誤兽埃。 |
<a name="module_serialport--SerialPort..BaseBinding+set"></a>
baseBinding.set([options])
? <code>Promise</code>
設(shè)置一個(gè)打開的串口的控制標(biāo)志侥钳。
Kind: 實(shí)例方法<code>BaseBinding</code>
Returns: <code>Promise</code> - 在串口的標(biāo)識被設(shè)置后返回.
Throws:
- <code>TypeError</code> 當(dāng)給定一個(gè)無效的參數(shù),將會拋出TypeError錯誤.
參數(shù) | 類型 | 默認(rèn) | 描述 |
---|---|---|---|
[options] | <code>object</code> | 當(dāng)串口被打開時(shí)柄错,所有設(shè)置都是操作系統(tǒng)的默認(rèn)設(shè)置. 每個(gè)標(biāo)識都被設(shè)置成每次調(diào)用時(shí)提供的或者默認(rèn)的數(shù)值舷夺。所有設(shè)置通常都是被提供的. | |
[options.brk] | <code>Boolean</code> | <code>false</code> | |
[options.cts] | <code>Boolean</code> | <code>false</code> | |
[options.dsr] | <code>Boolean</code> | <code>false</code> | |
[options.dtr] | <code>Boolean</code> | <code>true</code> | |
[options.rts] | <code>Boolean</code> | <code>true</code> |
<a name="module_serialport--SerialPort..BaseBinding+get"></a>
baseBinding.get()
? <code>Promise</code>
從打開的串口中獲得控制標(biāo)識(CTS, DSR, DCD).
Kind: 實(shí)例 <code>BaseBinding</code>
Returns: <code>Promise</code> - 當(dāng)標(biāo)識被獲取后返回.
Throws:
- <code>TypeError</code> 當(dāng)給定一個(gè)無效的參數(shù),將會拋出TypeError錯誤.
<a name="module_serialport--SerialPort..BaseBinding+flush"></a>
baseBinding.flush()
? <code>Promise</code>
接收到的沖洗 (丟棄)的數(shù)據(jù)不會被讀寫也不會傳輸.
Kind: 實(shí)例方法 <code>BaseBinding</code>
Returns: <code>Promise</code> - 當(dāng)沖洗操作結(jié)束后返回.
Throws:
- <code>TypeError</code> 當(dāng)給定一個(gè)無效的參數(shù)售貌,將會拋出TypeError錯誤.
<a name="module_serialport--SerialPort..BaseBinding+drain"></a>
baseBinding.drain()
? <code>Promise</code>
耗盡等待所有輸出數(shù)據(jù)被傳輸?shù)酱诤?
Kind: instance method of <code>BaseBinding</code>
Returns: <code>Promise</code> - 耗盡操作結(jié)束后調(diào)用.
Throws:
- <code>TypeError</code>當(dāng)給定一個(gè)無效的參數(shù)给猾,將會拋出TypeError錯誤.
<a name="module_serialport--SerialPort..BaseBinding.list"></a>
BaseBinding.list()
? <code>Promise</code>
從元數(shù)據(jù)中找回可用的串口列表. 只有“串口名”是可用的,所有其他的字段如果它們不可用颂跨,將會無意義耙册。 串口名
也是一個(gè)路徑或者一個(gè)標(biāo)識符(例如 COM1
)用來打開串口.
Kind: 實(shí)例方法 <code>BaseBinding</code>
Returns: <code>Promise</code> - 串口列表數(shù)組info objects.
<a name="module_serialport--SerialPort..errorCallback"></a>
SerialPort~errorCallback
: <code>function</code>
錯誤或者null的回調(diào)
Kind: 內(nèi)部類型定義 <code>SerialPort</code>
參數(shù) | 類型 |
---|---|
error | <code>error</code> |
<a name="module_serialport--SerialPort..modemBitsCallback"></a>
SerialPort~modemBitsCallback
: <code>function</code>
控制標(biāo)識(cts, dsr, dcd)一個(gè)錯誤或者對象產(chǎn)生回調(diào).
Kind: 內(nèi)部類型定義 <code>SerialPort</code>
參數(shù) | 類型 | 默認(rèn) |
---|---|---|
error | <code>error</code> | |
status | <code>object</code> | |
[status.cts] | <code>boolean</code> | <code>false</code> |
[status.dsr] | <code>boolean</code> | <code>false</code> |
[status.dcd] | <code>boolean</code> | <code>false</code> |
<a name="module_serialport--SerialPort..openOptions"></a>
SerialPort~openOptions
: <code>Object</code>
Kind: 內(nèi)部類型定義 <code>SerialPort</code>
Properties
名稱 | 類型 | 默認(rèn) | 描述 |
---|---|---|---|
Binding | <code>module:serialport~Binding</code> | 硬件訪問綁定, 綁定是node SreialPort如何和底層系統(tǒng)通信.默認(rèn)的,我們自動判斷Windows (WindowsBinding ), Linux (LinuxBinding ) 和 OSX (DarwinBinding )系統(tǒng)毫捣,以及加載合適我們系統(tǒng)的模塊. |
|
autoOpen | <code>boolean</code> | <code>true</code> | 在 nextTick 自動打開串口 |
lock | <code>boolean</code> | <code>true</code> | 防止其他進(jìn)程打開串口. 目前不支持Windows系統(tǒng). |
baudRate | <code>number</code> | <code>9600</code> | 已經(jīng)打開的串口的波特率. 這個(gè)應(yīng)該匹配一個(gè)常用的波特率详拙,比如 110, 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200. 這些是不確定的, 設(shè)備連接到串口上將支持請求的波特率,即使串口自己支持那個(gè)波特率蔓同。 |
dataBits | <code>number</code> | <code>8</code> | 必須是其中之一: 8, 7, 6, or 5. |
stopBits | <code>number</code> | <code>1</code> | 必須是其中之一: 1 or 2. |
highWaterMark | <code>number</code> | <code>16384</code> | 讀寫緩存區(qū)大小饶辙,默認(rèn)是 16k |
parity | <code>string</code> | <code>"none"</code> | 必須是其中之一: 'none', 'even', 'mark', 'odd', 'space' |
rtscts | <code>boolean</code> | <code>false</code> | 流控制設(shè)置 |
xon | <code>boolean</code> | <code>false</code> | 流控制設(shè)置 |
xoff | <code>boolean</code> | <code>false</code> | 流控制設(shè)置 |
xany | <code>boolean</code> | <code>false</code> | 流控制設(shè)置 |
bindingOptions | <code>object</code> | 設(shè)置特定的綁定選項(xiàng) | |
bindingOptions.vmin | <code>number</code> | <code>1</code> | 查看man termios LinuxBinding和 DarwinBinding |
bindingOptions.vtime | <code>number</code> | <code>0</code> | 查看man termios LinuxBinding 和 DarwinBinding |
<a name="module_serialport--SerialPort..listCallback"></a>
SerialPort~listCallback
: <code>function</code>
這個(gè)回調(diào)類型叫做 requestCallback
,作為一個(gè)全局標(biāo)識展示斑粱。
Kind: 內(nèi)部類型定義 <code>SerialPort</code>
參數(shù) | 類型 | 描述 |
---|---|---|
error | <code>error</code> | |
ports | <code>array</code> | 串口信息的對象數(shù)組 |
命令行工具
如果你全局安裝了 serialport
. (例如 npm install -g serialport
) 你會獲得兩個(gè)命令行工具.
串口列表
serialport-list
將會通過不同的格式列出所有可用的串口.
$ serialport-list -h
Usage: serialport-list [options]
List available serial ports
Options:
-h, --help 輸出幫助信息
-V, --version 輸出版本號
-f, --format <type> 輸出的格式: text, json, or jsonline. 默認(rèn)的是: text
$ serialport-list
/dev/cu.Bluetooth-Incoming-Port
/dev/cu.usbmodem1421 Arduino (www.arduino.cc)
$ serialport-list -f json
[{"comName":"/dev/cu.Bluetooth-Incoming-Port"},{"comName":"/dev/cu.usbmodem1421","manufacturer":"Arduino (www.arduino.cc)","serialNumber":"752303138333518011C1","locationId":"0x14200000","vendorId":"0x2341","productId":"0x0043"}]
$ serialport-list -f jsonline
{"comName":"/dev/cu.Bluetooth-Incoming-Port"}
{"comName":"/dev/cu.usbmodem1421","manufacturer":"Arduino (www.arduino.cc)","serialNumber":"752303138333518011C1","locationId":"0x14200000","vendorId":"0x2341","productId":"0x0043"}
串口終端
serialport-term
提供基礎(chǔ)的命令的接口給一個(gè)串口通信使用弃揽。 通過ctrl+c
退出.
$ serialport-term -h
Usage: serialport-term -p <port> [options]
A basic terminal interface for communicating over a serial port. Pressing ctrl+c exits.
Options:
-h, --help 輸出幫助信息
-V, --version 輸出版本號
-l --list 列出可用串口然后退出
-p, --port, --portname <port> 串口的路徑或者名稱
-b, --baud <baudrate> 波特率,默認(rèn)是: 9600
--databits <databits> 數(shù)據(jù)字節(jié) 默認(rèn)是: 8
--parity <parity> 奇偶性,默認(rèn)是: none
--stopbits <bits> 停止位矿微,默認(rèn)是: 1
--echo --localecho 打印類型痕慢,你輸入它們時(shí).
$ serialport-term -l
/dev/cu.Bluetooth-Incoming-Port
/dev/cu.usbmodem1421 Arduino (www.arduino.cc)