TS-7680 采用標(biāo)準(zhǔn)系統(tǒng)架構(gòu)介面來控制 GPIO,因此支持 GPIO 的軟件包可由 Sysfs 接口在任何電路板上使用。
要控制GPIO,我們必須首先將GPIO編號(hào)寫入,然后使用文件讀取和寫入方向(輸入的有效值為“輸入”,輸出為“輸出”) 。我們還使用文件讀取和寫入GPIO的值,其中有效值為“高”和“低”。/sys/class/gpio/export/sys/class/gpio/gpio#/direction/sys/class/gpio/gpio#/direction
現(xiàn)在,讓我們看一下 中的實(shí)現(xiàn)。首先,我們需要“fs”模塊,因?yàn)槲覀儗⑴c文件系統(tǒng)中的 sysfs 文件進(jìn)行交互以控制我們的 GPIO:gpio.js
var fs = require(“fs”)
在執(zhí)行其他任何操作之前,讓我們實(shí)現(xiàn)一個(gè)函數(shù),以確保在實(shí)際訪問控制 GPIO 的 sysfs 文件之前已執(zhí)行 GPIO 初始化。這相當(dāng)簡單。只需嘗試將 GPIO 編號(hào)寫入導(dǎo)出文件并返回指示它是否成功的布爾值:
現(xiàn)在讓我們看一下該函數(shù)。當(dāng)我們寫入 sysfs 文件時(shí),我們將編寫一個(gè)字符串,該字符串將以某種方式命令內(nèi)核。此函數(shù)打開指定的文件并寫入字符串。由于寫入操作非常小,并且無需接觸任何存儲(chǔ)介質(zhì)即可與內(nèi)核交互,因此我們使用同步寫入。發(fā)生的任何錯(cuò)誤都將引發(fā)異常,我們將捕獲該異常以確定是否返回成功(true)或不返回(false)。TryWrite
現(xiàn)在,我們已準(zhǔn)備好實(shí)際讀取或?qū)懭?GPIO。該函數(shù)將讀取 GPIO 編號(hào)并返回指示 GPIO 當(dāng)前狀態(tài)的字符串。如果 GPIO 是輸入,則返回的值將為“I”或 “;如果 GPIO 作為輸出被主動(dòng)驅(qū)動(dòng),則返回的值將為 ”“ 或 ”“。如果出現(xiàn)問題,也可以返回“”。gpio_getNPUT_HIGHINPUT_LOWHIGHLOWERROR
讓我們一步一步地看看該怎么做。首先,我們根據(jù)傳遞的 GPIO 編號(hào)獲取 GPIO 文件的路徑:
在此之后,我們確保在sysfs中初始化GPIO,如果不成功,則返回錯(cuò)誤。例如,傳遞的值可能無效:
if (!gpio_init(path,num)) return “ERROR”
然后,我們可以通過讀取相對(duì)于GPIO路徑的文件來獲得GPIO的方向。這將是“”表示輸出,或“”表示輸入:directionOUTIN
var dir=fs.readFileSync(path+“/direction”, “utf8”)
接下來,我們通過讀取文件來獲取GPIO的值。這將是一個(gè)“”或“,”,它將轉(zhuǎn)換為一個(gè)數(shù)字:value10
var data=Number(fs.readFileSync(path+“/value”, “utf8”))
最后,我們將方向/值對(duì)轉(zhuǎn)換為相應(yīng)的字符串,該字符串返回給調(diào)用者:
Writing to a GPIO
下面是用于寫入 GPIO 的函數(shù)。就像 在 中一樣,我們根據(jù) GPIO 編號(hào)檢索基本路徑,并確保 GPIO 已初始化:gpio_setgpio_get
現(xiàn)在,我們將傳遞的值(即“,”“,”或“”)轉(zhuǎn)換為要發(fā)送到方向寄存器的命令:INPUTHIGHLOW
剩下的就是編寫命令并將成功或失敗返回給調(diào)用方:
處理 HTTP 請(qǐng)求
此時(shí),我們已準(zhǔn)備好編寫函數(shù)來處理 HTTP 請(qǐng)求以執(zhí)行所請(qǐng)求的函數(shù)。首先,我們將 URL 拆分為多個(gè)組件。第一個(gè)組件將是基本網(wǎng)址(例如“gpio”);如果有兩個(gè)組件,我們將獲得指定的GPIO值;如果有三個(gè)組件,我們將指定的GPIO設(shè)置為指定的值。如果組件數(shù)量有任何不同,則發(fā)出的請(qǐng)求無效,我們將返回錯(cuò)誤:
我們要做的下一件事是將GPIO編號(hào)拆分為一個(gè)數(shù)組。我們使用逗號(hào)字符執(zhí)行此操作,它允許將多個(gè) GPIO 指定為逗號(hào)分隔的列表。如果不存在逗號(hào),則僅指定一個(gè) GPIO,并且將返回一個(gè)包含單個(gè)元素的數(shù)組:
var numlist = url[1].split(“,”)
現(xiàn)在我們準(zhǔn)備開始發(fā)送我們的回復(fù)。由于正在發(fā)送JSON字符串,請(qǐng)繼續(xù)寫出開頭的數(shù)組字符:
res.write(“[”)
接下來,我們?cè)谡?qǐng)求中的所有GPIO號(hào)碼上設(shè)置一個(gè)循環(huán):
for (i=0;i
因?yàn)槲覀冋诰帉懸粋€(gè)JSON數(shù)組,所以需要在每個(gè)元素之間發(fā)送一個(gè)逗號(hào)。如果前面有一個(gè)元素,我們可以在每個(gè)元素的開頭寫逗號(hào):
if (i》0) res.write(“,”)
現(xiàn)在,我們將GPIO數(shù)字轉(zhuǎn)換為整數(shù),并進(jìn)行一些錯(cuò)誤檢查:
接下來,我們查看參數(shù)的數(shù)量,以決定是獲取還是設(shè)置GPIO信息。我們存儲(chǔ)返回字符串并將其寫入輸出:
循環(huán)完成后,我們關(guān)閉JSON數(shù)組并完成向客戶端的發(fā)送:
最后是我們的模塊。導(dǎo)出功能。我們處理任何選項(xiàng)并設(shè)置端點(diǎn)以連接到我們的gpio功能:
下一部分將討論如何支持加速計(jì)。
審核編輯:郭婷
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9160瀏覽量
85425 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52102
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論