1、背景
該到轉嵌入式LInux應用開發的時候了。現在學習,不晚吧。努力。
1.1 參考資料
http://emb.hqyj.com/Column/Column811.htm
http://www.hqyj.com/news/emb174.htm
http://blog.chinaunix.net/uid-11582448-id-745506.html
https://blog.csdn.net/TAlice/article/details/80077064
2、termios.h 的分析
2.0 termios 結構體
termios是Posix規範中定義的標準接口,表示終端設備(包括虛擬終端、串口等)。由於串口是一種終端設備,因此通過終端編程接口對其進行配置和控制。
#define NCCS 18
struct termios
{
unsigned short c_iflag; // 輸入模式標誌
unsigned short c_oflag; // 輸出模式標誌
unsigned short c_cflag; // 控制模式標誌
unsigned short c_lflag; // 本地模式標誌
unsigned char c_line; // 線路規程
unsigned char c_cc[NCC]; // 控制特性
speed_t c_ispeed; // 輸入速度
speed_t c_ospeed; // 輸出速度
}
在結構體termios中c_cflag最爲重要,可設置波特率、數據位、校驗位、停止位。對於c_cflag成員不能直接對其初始化,而要將其通過 & 和 | 操作使用其中的某些選項。
/* cflag bits */
/* Baud rate values. These must fit in speed_t, which is unsigned
char. See also the extended baud rates below. These baud rates
set an additional bit. */
#define CBAUD 0x0100f //波特率的位掩碼
#define B0 0x00000 //0波特率(放棄DTR)
#define B50 0x00001
#define B75 0x00002
#define B110 0x00003
#define B134 0x00004
#define B150 0x00005
#define B200 0x00006
#define B300 0x00007
#define B600 0x00008
#define B1200 0x00009
#define B1800 0x0000a
#define B2400 0x0000b
#define B4800 0x0000c
#define B9600 0x0000d
#define B19200 0x0000e
#define B38400 0x0000f
#define CSIZE 0x00030 //數據位的位掩碼
#define CS5 0x00000 //5個數據位
#define CS6 0x00010 //6個數據位
#define CS7 0x00020 //7個數據位
#define CS8 0x00030 //8個數據位
#define CSTOPB 0x00040 //默認兩位停止位,否則爲1位
#define CREAD 0x00080 //接收使能
#define PARENB 0x00100 //校驗位使能
#define PARODD 0x00200 //使用奇校驗而不使用偶校驗
#define HUPCL 0x00400 //關閉時掛線(放棄DTR)
#define CLOCAL 0x00800 //本地鏈接(不改變端口所有者)
/* Extended baud rates above 37K. */
#define CBAUDEX 0x0100f
#define B57600 0x01001
#define B115200 0x01002
#define B128000 0x01003
#define B230400 0x01004
#define B256000 0x01005
#define B460800 0x01006
#define B500000 0x01007
#define B576000 0x01008
#define B921600 0x01009
#define B1000000 0x0100a
#define B1152000 0x0100b
#define B1500000 0x0100c
#define B2000000 0x0100d
#define B2500000 0x0100e
#define B3000000 0x0100f
#define CRTSXOFF 0x04000
#define CRTSCTS 0x08000 //使能硬件流控
成員c_iflag控制端口接收端的字符輸入處理(Read)
/* iflag bits */
#define IGNBRK 0x00001 //忽略中斷情況
#define BRKINT 0x00002 //當發生中斷時發送SIGINT信號
#define IGNPAR 0x00004 //忽略奇偶校驗
#define IMAXBEL 0x00008 //當輸入太長時回覆ECHO(振鈴)
#define INPCK 0x00010 //打開輸入奇偶校驗
#define ISTRIP 0x00020 //剝除輸入字符的第8位
#define INLCR 0x00040 //將輸入的NL轉換爲CR
#define IGNCR 0x00080 //忽略CR
#define ICRNL 0x00100 //將輸入額CR映射到NL
#define IXON 0x00400 //使啓動/停止輸出控制流起作用 啓動輸出軟件流控
#define IXOFF 0x01000 //使啓動/停止輸入控制流起作用 啓動輸入軟件流控
#define IUCLC 0x04000 //將輸入的大寫字符轉換爲小寫字符
#define IXANY 0x08000 //允許字符重新啓動輸出
#define PARMRK 0x10000 //標記奇偶校驗錯誤
成員c_lflag 用於控制終端的本地數據處理和工作模式。通過c_lflag成員控制終端的某些特性。
/* lflag bits */
#define ISIG 0x0001 //若收到信號字符(INTR、QUIT等),則會產生相應的信號
#define ICANON 0x0002 //終端規範模式,默認爲規範模式,否則爲非規範模式
#define ECHO 0x0004 //啓動輸入字符的本地本地回顯功能
#define ECHOE 0x0008 //若設置ICANNO,則允許退格操作
#define ECHOK 0x0010 //若設置ICANNO,則KILL字符會刪除當前行
#define ECHONL 0x0020 //若設置ICANNO, 則允許回顯換行符
#define NOFLSH 0x0040 //在通常情況下,當接受到INTR、QUIT和SUSP控制字符時,會清空輸入和輸出隊列。如果設置該標誌,則所有的隊列不會被清空
#define TOSTOP 0x0080 //若一個後臺進程試圖向它的控制終端進行寫操作,則系統向該後臺進程的進程組發送SIGTTOU信號,該信號通常終止進程的執行
#define IEXTEN 0x0100 //啓用輸入處理功能
#define FLUSHO 0x0200
#define ECHOKE 0x0400
#define ECHOCTL 0x0800 //若設置ECHO,則控制字符(製表符、換行符)會顯示成"^X",其中X的ASCII碼等於給相應控制字符的ASCII碼加上0x40.例如退格符(0x08)會顯示爲"^H"('H'的ASCII碼爲0x48)
2.1 終端
終端是指用戶與計算機交互的接口,如鍵盤、顯示屏和串口設備等物理設備,還有X Window上的虛擬終端。
2.1.1虛擬終端:
Windows下由putty SecureCRT等虛擬終端;
類UNIX操作系統有行term、rxvt、zterm、eterm等。 文本式虛擬終端 X Window 上的圖形式虛擬終端。
2.1.2 終端工作模式
終端有三種工作模式:規範模式(canonical mode )、非規範模式(non-canonical mode)和原始模式(raw mode).可通過termios.c_lflag的ICANNON位來配置。選擇規範模式則設置ICANNON位,非規範模式則清除ICANNON位。
<1>規範模式----面向行
在規範模式下,輸入數據基於行進行處理。
>在用戶輸入一個行結束符(回車符、EOF等)之前,系統調用read()讀不到用戶輸入的任何字符。
>除了EOF之外的行結束符(如回車符等),與普通字符一樣會被read()讀到緩衝區中。
>在規範模式中,可以進行行編輯,而且一次調用read()最多隻能讀取到一行數據。
>如果read()請求讀取的數據字節少於當前行可讀取的字節時,則read()只讀取被請求的字節數,剩餘的下次再讀。
輸入字符會被放入一個緩衝中,這樣可以以與用戶交互的方式編輯緩衝區的內容,知道收到CR(carriage return,回車)或者LF(Line feed,換行)字符。
規範模式下,設置ICANNO、ECHO和ECHOE選項。
|= (ICANNO | ECHO | ECHOE);
<2> 非規範模式
在非規範模式下,所有的輸入即時生效,用戶不需要另外輸入行結束符,不能進行行編輯。read()有四種中作模式。
可通過termios.c_cc[MIN] 和termios.c_cc[TIMEOUT]來設置工作模式。這裏TIMEOUT的單位爲1/10秒。
MIN | TIMEOUT | 工作模式 |
=0 | =0 | read()立即返回。若有數據可讀,則讀取並返回讀取的字節數,否則返回0。 |
>0 | =0 | read()被阻塞,直到MIN個字節數據可被讀取。 |
=0 | >0 | 若數據可讀,或超過TIMEOUT無數據,則read()返回。 |
>0 | >0 | 若MIN個字節可讀,或超過TIMEOUT無數據,則read()返回。 |
設置非規範模式,需要請掉ICANNO、ECHO、ECHOE和ISIG選項。
&= ~(ICANNO | ECHO | ECHOE | ISIG);
<3>原始模式
原始模式是一種特殊的非規範模式。在這種模式下,所有輸入數據以字節爲單位處理。原始輸入根本不會被處理,輸入字符只是被原封不動的接收。
3、串口初始化、設置和讀寫代碼
4、