轉 tty 裝置讀寫

2022-01-11 12:06:58 字數 2253 閱讀 8962

**

我有乙個裝置通過 usb 傳輸資訊到我的計算機。arch linux 通過在/dev/下建立了乙個

名為ttyusb0的檔案來設定這台裝置。我一直使用gtkterm來接收資訊並將資訊顯示在一

個模擬終端視窗上。

我的問題是:gtkterm具體是怎樣讀/寫ttyusb0這個檔案的,我從哪兒能學到實現相似

功能的技術?即,從最簡單的情況來說,我怎麼寫乙個字元到ttyusb0,或者從它接收一

個位元組並寫入到檔案中去?

你可以像使用其他檔案一樣使用 ttys 檔案。你可以用你所用語言開啟檔案的一般方法來打

開它們並讀寫。他們是相比於其他「普通」檔案是有一些特殊行為,但基本來說是一樣的。我

會在文末說到一些特殊情況,但還是先看一些實驗吧。

你可以在乙個普通終端做的一件有趣的事情是,執行tty它就會列印和下面相似的一行輸出:

1

/dev/pts/2

這是你的終端執行所依賴的 tty 裝置,你可以向那個終端寫點什麼:

123

$ echo hello > /dev/pts/2

hello

$

你甚至可以從它讀取資訊:

123

45

$ read x < /dev/pts/2

hello

$ echo $x

hello

$

(read xsh用來「從標準輸入讀取一行並儲存到變數 x」的命令;<表示使用/dev/pts/2

作為 read 命令的標準輸入;第乙個「hello」是我鍵入的,第二個是終端輸出的)。

如果你用screenxterm開啟另乙個 shell,你可以在新開啟的那個 shell 裡執行

echo spooky > /dev/pts/2,這些文字會在你原來的 shell 裡顯示出來,對其他命令來

說也是一樣的。

以下這個很簡單的 c 程式就可以做到你想做的事,向/dev/pts/3寫入乙個字元,然後從

它那兒讀取乙個位元組:

123

4567

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...