Linux程式設計 關於串列埠通訊程式設計的幾個問題

2021-10-08 08:52:08 字數 1521 閱讀 2083

編者按:看《鳥哥的linux私房菜》,說記錄問題和解決方案是個特別好的習慣。好哦,在學習串列埠程式設計的時候遇到了許多問題也查了一些資料,有的解決了有的還沒有,有的明白了有的還沒有。在這裡做乙個記錄。

學習參考資料:

慕課課程:嵌入式linux應用與開發實踐(國家精品(平震宇 、劉麗 、許常青 、匡亮 、凌路 、李濤

「wuyujun's blog」的原創文章:linux串列埠程式設計

這個問題說來也十分沙雕,在讀和寫程式中我用的是同乙個串列埠,以為就是對同乙個檔案進行讀寫而已,結果一直寫不進東西,自然也讀不到。而且我完全沒有意識到我的虛擬機器根本就沒有虛擬串列埠可以使用。

參考文章:

利用linux虛擬機器進行串列埠通訊模擬

vmware虛擬機器串列埠新增與除錯

說一下,串列埠其實是乙個硬體裝置,只不過linux中「萬物皆檔案」,所以對檔案(ttysx)的讀寫就是對串列埠的讀寫,但這個裝置檔案它又不是普普通通簡簡單單的檔案,實質上它是和硬體裝置一樣的,所以沒有硬體裝置的時候,看到的檔案就是個空殼子而已,對它怎麼寫和讀都是沒有用的。所以根據上面兩篇文章設定好兩個虛擬串列埠,就可以在虛擬機器中實現兩個串列埠的通訊。

「測試是否連通:以root許可權,在乙個終端中執行cat /dev/ttys1,在另乙個終端中執行echo

1234>/dev/ttys2,如果在第乙個終端中收到1234,則表明已經連通!!」

說一下對上面這句話的理解:

cat相當於對串列埠的讀,就是開啟裝置檔案/dev/ttys1看裡面的東西;

echo就是寫,> 即重定向,把1234寫到/dev/ttys2中

串列埠ttys2將資料傳送到/dev/ttys1中,就可以在/dev/ttys1裡面看到 1234

串列埠程式設計讀寫端的原理也不過大致如此。

參考文章:

linux下串列埠通訊開啟正常,傳送正常,但是接收不到資料的解決辦法

關於嵌入式linux下的串列埠通訊問題—回車、換行、緩衝

「發現是串列埠配置一般在正規模式(.c_lflag =icanon)下,因此資料讀取到時一直存放在緩衝區,read()進行讀取時只有識別到"回車"或者「換行」符號的時候,才會從緩衝區讀取成功。」

重點如上,大致的原因就是傳送端傳送的資料一直放在快取裡面,可是讀端必須讀到回車或者換行的時候才會將資料中讀取出來。

這裡我在寫程式中的buf資料加上\n後,讀端能夠讀到資料,但卻會連續讀兩次(即寫一次讀了兩次),第一次讀到的是正確的資料,第二次讀出了換行。具體情形如下圖,這個問題暫時還想不明白,先放在這裡【2020.7.21】

Linux 串列埠通訊程式設計

串列埠通過直接連線在兩台裝置間的線傳送和接收資料,兩台裝置通訊最少需要三根線 傳送資料 接收資料和接地 才可以通訊。以最常見的 rs232 串列埠為例,通訊距離較近時 12m 可以用電纜線直接連線標準 rs232 埠。如果傳輸距離遠,可以通過數據機 modem 傳輸。因為串列埠裝置工作頻率低且容易受...

Linux 下串列埠通訊程式設計

int open com char device name return fd end of open com 一 串列埠程式需要的標頭檔案 include 標準輸入輸出定義 include 標準函式庫定義 include unix標準函式定義 include include include 檔案控...

VC串列埠通訊程式設計

win32串列埠程式設計 韓耀旭 在工業控制中,工控機 一般都基於windows平台 經常需要與智慧型儀表通過串列埠進行通訊。串列埠通訊方便易行,應用廣泛。一般情況下,工控機和各智慧型儀表通過rs485匯流排進行通訊。rs485的通訊方式是半雙工的,只能由作為主節點的工控pc機依次輪詢網路上的各智慧...