node環(huán)境下使用serialport對硬件指令進行封裝

連通硬件

首先,要確保你能用機器指令連通硬件,連通工具windows下推薦sscom,mac下推薦RS232 Tool 他們都能發(fā)送十六進制數(shù)據(jù)且都是免費

這里講一下異步串口協(xié)議
一,232(三根線,雙方都是2線接3線反序接,再加一根地線,故名232協(xié)議),雙工短距,用途最廣泛,一般電腦調試硬件都是用這個,因為短距傳輸速率可以設成超高不用擔心丟幀問題
二,485 (分Rx+,Rx-接口,順序連接),半工長距,用于遠距離呼叫應答
三,422 (分Rx+,Rx-,Tx+,Tx-接口,反序連接),雙工長距,接線比較復雜

選好協(xié)議,裝好驅動,拿到硬件文檔,一般硬件文檔中會給協(xié)議的幀頭和幀體,幀尾一般用于校驗,一般用奇偶校驗或是crc冗余校驗,需要自己去計算,推薦一個網(wǎng)站www.23bei.com,這里可以根據(jù)通信協(xié)議自動生成校驗碼.另外單片機的數(shù)據(jù)位與軟件是高低位反序的,記得自己手工做好調整

自己組裝好硬件指令之后,根據(jù)與硬件協(xié)議好的波特率,校驗停止與數(shù)據(jù)位,就可以和硬件通信了.這里由于是232協(xié)議,近距離傳輸,就可以選擇超高速的230400波特率,每秒速度接近30M,硬件指令響應都是微秒級別的,沒有任何延遲.

這是我用串口調試助手與硬件的一次通信模擬

配置serialport

serialport是node環(huán)境下唯一一個串口連接包,想要用node操控硬件,這個庫是必須要攻克的一道難關

npm install serialport --save 之后,我進入node_modules發(fā)現(xiàn)這個包是一堆cpp文件,作者為了提高效率,使用c++來操控硬件,我們首先要把這個包編譯成node能夠識別的.node二進制文件.

首先確保你的node版本在V8.0以上,phtyon為2.7版本(尤其不能用3以上的版本),具備基本的C++編譯環(huán)境(vs C++ 或者 Xcode 都可以)

我是在electron框架下編譯的,還要額外下載electron,electron-rebuild兩個包,然后使用electron-rebuild命令就可以編譯serialport了,npm下載electron-rebuild過程中可能會報404錯誤,這個不用管,因為作者已經不再維護了,所以如果你的系統(tǒng)比較新的話他會找不到對應的serialport二進制文件,我們下好自己編譯就行了.

如何封裝硬件指令

js中變量的大小都是8字節(jié)浮點數(shù),64bit,這個在TCP中問題不大,但是在硬件傳輸協(xié)議中,這么大的變量是在災難級的,所以我們參照c語言對js變量從新定義

封裝通信幀偽代碼:
//定義數(shù)據(jù)幀都為8位無符號整形, Uint8Array類似于set,內置方法也雷同
//幀長度為頭部(指令含義),幀體(指令內容),幀尾(CRC,檢測是否有傳輸錯誤),也可自己定義其他的通信協(xié)議
const crc = require('crc')
calcCRC() {
    //引用crc包
    const r = crc.crc16modbus(headFrame+ bodyFrame)
    //>>為拋棄高8位,這是個反序操作
    return Uint8Array.of(r >> 8, r)
}
let Frame = new Uint8Array(headFrame.length + bodyFrame.length+CRC.length)
Frame.set(headFrame)
//假設幀頭為2字節(jié)
Frame.set(bodyFrame, 2)
Frame.set(calcCRC(), headFrame.length + bodyFrame.length)
return Frame 

檢測返回的數(shù)據(jù)幀同理,先判斷其長度,如果過短是丟幀,如果過長是緩存溢出,需要截取,如果長度正好合適就判斷其crc,如果吻合則沒有傳輸錯誤,解析幀體向上層傳遞

解析幀偽代碼:
  parse() {
    // length為約定的指令長度,由于約定crc+幀頭為四字節(jié),所以即使空包也要大于四
    // data.length 為返回的指令長度,由于length可以使變長度指令,所以要判斷一下data.length
    if ((length > 0 && data.length < length) ||data.length < 4) {
      data = null
      return PARSE_CODE.LACK_DATA
    }
    const err = parseBody()
    // 過短提前返回
    if (err === PARSE_CODE.LACK_DATA) {
      data = null
      return PARSE_CODE.LACK_DATA
    }
    this.head = (data[0] << 8) + data[1]
    // 檢測crc
    if (!this.checkCRC()) {
      data = null
      return PARSE_CODE.CRC_DISS
    }
    data = null
    return err
  }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末少漆,一起剝皮案震驚了整個濱河市妖异,隨后出現(xiàn)的幾起案子乖酬,更是在濱河造成了極大的恐慌,老刑警劉巖残家,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑟俭,死亡現(xiàn)場離奇詭異陡舅,居然都是意外死亡酌住,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門刃麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醒叁,“玉大人,你說我怎么就攤上這事泊业“颜樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵脱吱,是天一觀的道長智政。 經常有香客問我,道長箱蝠,這世上最難降的妖魔是什么续捂? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮宦搬,結果婚禮上牙瓢,老公的妹妹穿的比我還像新娘。我一直安慰自己间校,他們只是感情好矾克,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憔足,像睡著了一般胁附。 火紅的嫁衣襯著肌膚如雪酒繁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天控妻,我揣著相機與錄音州袒,去河邊找鬼。 笑死弓候,一個胖子當著我的面吹牛郎哭,可吹牛的內容都是我干的。 我是一名探鬼主播菇存,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼夸研,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了依鸥?” 一聲冷哼從身側響起亥至,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贱迟,沒想到半個月后抬闯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡关筒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杯缺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒸播。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萍肆,靈堂內的尸體忽然破棺而出袍榆,到底是詐尸還是另有隱情,我是刑警寧澤塘揣,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布包雀,位于F島的核電站,受9級特大地震影響亲铡,放射性物質發(fā)生泄漏才写。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一奖蔓、第九天 我趴在偏房一處隱蔽的房頂上張望赞草。 院中可真熱鬧,春花似錦吆鹤、人聲如沸厨疙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沾凄。三九已至梗醇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撒蟀,已是汗流浹背叙谨。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牙肝,地道東北人唉俗。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像配椭,于是被迫代替她去往敵國和親虫溜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容