**
我有乙個裝置通過 usb 傳輸資訊到我的計算機。arch linux 通過在/dev/
下建立了乙個
名為ttyusb0
的檔案來設定這台裝置。我一直使用gtkterm
來接收資訊並將資訊顯示在一
個模擬終端視窗上。
我的問題是:gtkterm
具體是怎樣讀/寫ttyusb0
這個檔案的,我從哪兒能學到實現相似
功能的技術?即,從最簡單的情況來說,我怎麼寫乙個字元到ttyusb0
,或者從它接收一
個位元組並寫入到檔案中去?
你可以像使用其他檔案一樣使用 ttys 檔案。你可以用你所用語言開啟檔案的一般方法來打
開它們並讀寫。他們是相比於其他「普通」檔案是有一些特殊行為,但基本來說是一樣的。我
會在文末說到一些特殊情況,但還是先看一些實驗吧。
你可以在乙個普通終端做的一件有趣的事情是,執行tty
它就會列印和下面相似的一行輸出:
1
/dev/pts/2
這是你的終端執行所依賴的 tty 裝置,你可以向那個終端寫點什麼:
123
$ echo hello > /dev/pts/2hello
$
你甚至可以從它讀取資訊:
12345
$ read x < /dev/pts/2hello
$ echo $x
hello
$
(read x
是sh
用來「從標準輸入讀取一行並儲存到變數 x」的命令;<
表示使用/dev/pts/2
作為 read 命令的標準輸入;第乙個「hello」是我鍵入的,第二個是終端輸出的)。
如果你用screen
或xterm
開啟另乙個 shell,你可以在新開啟的那個 shell 裡執行
echo spooky > /dev/pts/2
,這些文字會在你原來的 shell 裡顯示出來,對其他命令來
說也是一樣的。
以下這個很簡單的 c 程式就可以做到你想做的事,向/dev/pts/3
寫入乙個字元,然後從
它那兒讀取乙個位元組:
1234567
891011
#include#include
#include
intmain
()
乙個繫結到 shell 或終端模擬器的真實 tty 裝置會產生一些有趣的行為,但你應該能得到
一些反饋(get something back)。
想要訪問乙個終端你需要有相應的許可權。這些只是標準的檔案許可權,就和你用ls -l
看到
還有用chmod
設定的一樣:你需要讀的許可權來開啟檔案並讀取它,寫的許可權來寫入它。在
你終端後面的 tty 將屬於你的,但其他使用者的並不,而對應於 usb 裝置的tty 可能屬於也
可可能不屬於你,這取決於你的配置。你可以用與平常相同的方法改變許可權。
只要所寫的程式可以與之正常互動,你就不需要做什麼特殊的設定。你可以在例子中看到你
並不需要為了讓另一頭讀取你寫入的資料而每次都關閉檔案:tty 檔案表現得像管道,只要
資料來了只管從兩端傳入。當我向 tty 寫文字時立馬就能顯示出來,所以當我後來從中讀
取的時候已經沒有資料等著我了。這並不跟寫入乙個普通檔案時資料會儲存到磁碟上一樣——
它會直接被傳送到另一端,或者儲存到記憶體中直到被讀取。
你可能會想用select
這個函式,它讓你可以在等待裝置傳入資料的做些其他事,當然如果
你就是想等待資料到來那你也可以使用阻塞的方式讀取,而讓作業系統做相關的排程。
需要時刻注意的一件事是核心中緩衝區的大小是有限的,如果你一次寫入的資料太多可能會
導致你不希望發生的阻塞。如果這是乙個問題的話,可以使用非阻塞 io 如
open("/dev/...",o_rdwr|o_nonblock)
。 不管哪種方式原則都是一樣的。
tty裝置驅動註冊簡述
注意 因為 tty driver核心層 和 uart driver 裝置層 的註冊是綁在一起的,所以把 核心層和裝置層一起分析 裝置驅動層的註冊其實一共只有三步驟 1 構造 uart裝置相關驅動結構體 2 uart register driver 同時註冊了tty driver 3 uart add...
裝置讀寫方式
1.緩衝區方式讀寫操作 1.1 readfile 讀取位元組數 stack parameters.read.length 輸出緩衝區 pirp associatedirp.systembuffer 輸出位元組數 pirp iostatus.information 1.2 writefile 寫入位元...
linux spi 裝置節點 讀寫
本文記錄spi裝置節點的操作方法。spi匯流排裝置檔名通常為 dev spidevn.p n 0 1 2 p 0 1 2 其中n表示第幾路spi匯流排,而p表示在該路spi匯流排中使用哪個cs訊號線。程式kernel documentation spi spidev test.c 編譯之後,miso...