linux串口數據傳輸出現問題的幾點總結

(一)很多時候當在使用串口的時候你會發現在read串口設備時會出現當機現象,出現這種現象的原因可能是你在open設備的時候沒有使用非阻塞的方式打開,在使用串口發送數據和接收數據的時候,或者注意select的配合使用達到非阻塞的讀取。

(二)在系統頭文件<termios.h>中定義了終端控制結構struct termios,tcgetattr()和tcsetattr()兩個系統函數獲得和設置這些屬性。結構struct termios中的域描述的主要屬性包括:

c_cflag  : 控制選項
c_lflag  : 線選項
c_iflag  : 輸入選項
c_oflag  :輸出選項
c_cc    :控制字符
c_ispeed :輸入數據波特率
c_ospeed :輸出數據波特率


如果要設置某個選項,那麼就使用"|="運算,如果關閉某個選項就使用"&="和"~"運算。本文使用的各個選項的意義定義如下:

c_cflag: CLOCAL 本地模式,不改變端口的所有者
         CREAD  表示使能數據接收器
         PARENB  表示偶校驗
         PARODD 表示奇校驗
CSTOPB  使用兩個停止位
CSIZE    對數據的bit使用掩碼
CS8      數據寬度是8bit
c_lflag:  ICANON 使能規範輸入,否則使用原始數據(本文使用)
ECHO    回送(echo)輸入數據
ECHOE   回送擦除字符
ISIG      使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信號
c_iflag:  IXON     使能輸出軟件控制
         IXOFF    使能輸入軟件控制
         IXANY    允許任何字符再次開啓數據流
         INLCR    把字符NL(0A)映射到CR(0D)
         IGNCR    忽略字符CR(0D)
       ICRNL    把CR(0D)映射成字符NR(0A)
    c_oflag: OPOST  輸出後處理,如果不設置表示原始數據(本文使用原始數據) 
c_cc[VMIN]:  最少可讀數據
c_cc[VTIME]: 等待數據時間(10秒的倍數)
如果以上的標誌沒有正確的屏蔽或設置,你的串口所收發的數據可能也不會正確,一定要注意這點

(三)由於串口設備經常在linux下使用,注意你要打開的終端設備名稱是否正確,"/dev/ttys0"注意不要省略根目錄符號,對於多串口通訊的芯片,注意打開的設備名稱對應。

 

發佈了57 篇原創文章 · 獲贊 15 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章