日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

详解linux下的串口通讯开发

發布時間:2023/12/13 综合教程 56 生活家
生活随笔 收集整理的這篇文章主要介紹了 详解linux下的串口通讯开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

串行口是計算機一種常用的接口,具有連接線少,通訊簡單,得到廣泛的使用。常用的串口是RS-232-C接口(又稱EIA RS-232-C)它是在1970年由美國電子工業協會(EIA)聯合貝爾系統、調制解調器廠家及計算機終端生產廠家共同制定的用于串行通訊的標準。串口通訊指的是計算機依次以位(bit)為單位來傳送數據,串行通訊使用的范圍很廣,在嵌入式系統開發過程中串口通訊也經常用到通訊方式之一。

Linux對所有設備的訪問是通過設備文件來進行的,串口也是這樣,為了訪問串口,只需打開其設備文件即可操作串口設備。在linux系統下面,每一個串口設備都有設備文件與其關聯,設備文件位于系統的/dev目錄下面。如linux下的/ttyS0,/ttyS1分別表示的是串口1和串口2。下面來詳細介紹linux下是如何使用串口的:

1. 串口操作需要用到的頭文件

#include /*標準輸入輸出定義*/

#include /*標準函數庫定義*/

#include /*Unix 標準函數定義*/

#include

#include

#include /*文件控制定義*/

#include /*POSIX 終端控制定義*/

#include /*錯誤號定義*/

#include /*字符串功能函數*/

2. 串口通訊波特率設置

波特率的設置定義在,其包含在頭文件里。

常用的波特率常數如下:

B0-------à0 B1800-------à1800

B50-----à50 B2400------à2400

B75-----à75 B4800------à4800

B110----à110 B9600------à9600

B134----à134.5 B19200-----à19200

B200----à200 B38400------à38400

B300----à300 B57600------à57600

B600----à600 B76800------à76800

B1200---à1200 B115200-----à115200

假定程序中想要設置通訊的波特率,使用cfsetispeed( )和cfsetospeed( )函數來操作,獲取波特率信息是通過cfgetispeed()和cfgetospeed()函數來完成的。比如可以這樣來指定串口通訊的波特率:

#include //頭文件定義

........

........

.......

struct termios opt; /*定義指向termios 結構類型的指針opt*/

/***************以下設置通訊波特率****************/

cfsetispeed(&opt,B9600 ); /*指定輸入波特率,9600bps*/

cfsetospeed(&opt,B9600);/*指定輸出波特率,9600bps*/

/************************************************/

.........

..........

一般來說,輸入、輸出的波特率應該是一致的。

3. 串口屬性配置

在程序中,很容易配置串口的屬性,這些屬性定義在結構體struct termios中。為在程序中使用該結構體,需要包含文件,該頭文件定義了結構體struct termios。該結構體定義如下:

#define NCCS 19

struct termios {

tcflag_t c_iflag; /* 輸入參數 */

tcflag_t c_oflag; /* 輸出參數 */

tcflag_t c_cflag; /* 控制參數*/

tcflag_t c_ispeed; /* 輸入波特率 */

tcflag_t c_ospeed; /* 輸出波特率 */

cc_t c_line; /* 線控制 */

cc_t c_cc[NCCS]; /* 控制字符*/

};

其中成員c_line在POSIX(Portable Operating System Interface for UNIX)系統中不使用。對于支持POSIX終端接口的系統中,對于端口屬性的設置和獲取要用到兩個重要的函數是:

(1).int tcsetattr(int fd,int opt_DE,*ptr)

該函數用來設置終端控制屬性,其參數說明如下:

l fd:待操作的文件描述符

l opt_DE:選項值,有三個選項以供選擇:

TCSANOW: 不等數據傳輸完畢就立即改變屬性

TCSADRAIN:等待所有數據傳輸結束才改變屬性

TCSAFLUSH:清空輸入輸出緩沖區才改變屬性

l *ptr:指向termios結構的指針

函數返回值:成功返回0,失敗返回-1。

(2).int tcgetattr(int fd,*ptr)

該函數用來獲取終端控制屬性,它把串口的默認設置賦給了termios數據數據結構,其參數說明如下:

l fd:待操作的文件描述符

l *ptr:指向termios結構的指針

函數返回值:成功返回0,失敗返回-1。

4. 打開串口

在前面已經提到linux下的串口訪問是以設備文件形式進行的,所以打開串口也即是打開文件的操作。函數原型可以如下所示:

int open(“DE_name”,int open_Status)

參數說明:

(1).DE_name:要打開的設備文件名

比如要打開串口1,即為/dev/ttyS0。

(2).open_Status:文件打開方式,可采用下面的文件打開模式:

l O_RDONLY:以只讀方式打開文件

l O_WRONLY:以只寫方式打開文件

l O_RDWR:以讀寫方式打開文件

l O_APPEND:寫入數據時添加到文件末尾

l O_CREATE:如果文件不存在則產生該文件,使用該標志需要設置訪問權限位mode_t

l O_EXCL:指定該標志,并且指定了O_CREATE標志,如果打開的文件存在則會產生一個錯誤

l O_TRUNC:如果文件存在并且成功以寫或者只寫方式打開,則清除文件所有內容,使得文件長度變為0

l O_NOCTTY:如果打開的是一個終端設備,這個程序不會成為對應這個端口的控制終端,如果沒有該標志,任何一個輸入,例如鍵盤中止信號等,都將影響進程。

l O_NONBLOCK:該標志與早期使用的O_NDELAY標志作用差不多。程序不關心DCD信號線的狀態,如果指定該標志,進程將一直在休眠狀態,直到DCD信號線為0。

函數返回值:

成功返回文件描述符,如果失敗返回-1

例如假定以可讀寫方式打開/dev/ttyS0設備,就可以這樣操作:

#include //頭文件包含

......

......

int fd; /* 文件描述符 */

fd = open("/dev/ttyS0", O_RDWR | 0_NOCTTY); /*以讀寫方式打開設備*/

if(fd == -1)

perror("Can not open Serial_Port 1/n!");/*打開失敗時的錯誤提示*/

........

........

5. 串口讀操作(接收端)

用open函數打開設備文件,函數返回一個文件描述符(file descriptors,fd),通過文件描述符來訪問文件。讀串口操作是通過read函數來完成的。函數原型如下:

int read(int fd, *buffer,length);

參數說明:

(1).int fd:文件描述符

(2).*buffer:數據緩沖區

(3).length:要讀取的字節數

函數返回值:

讀操作成功讀取返回讀取的字節數,失敗則返回-1。

6. 串口寫操作(發送端)

寫串口操作是通過write函數來完成的。函數原型如下:

write(int fd, *buffer,length);

參數說明:

(1).fd:文件描述符

(2).*buffer:存儲寫入數據的數據緩沖區

(3).length:寫入緩沖去的數據字節數

函數返回值:

成功返回寫入數據的字節數,該值通常等于length,如果寫入失敗返回-1。

例如:向終端設備發送初始化命令

#include //頭文件包含

......

......

int n

sbuf[]={Hello,this is a Serial_Port test!/n };//待發送數據

int len_send="sizeof"(sbuf);//發送緩沖區字節數定義

n = write(fd,sbuf,len_send); //寫緩沖區

if(n == -1)

{

printf("Wirte sbuf error./n");

}

......

......

7. 關閉串口

對設備文件的操作與對普通文件的操作一樣,打開操作之后還需要關閉,關閉串口用函數close( )來操作,函數原型為:

int close(int fd);

參數說明:

fd:文件描述符

函數返回值:

成功返回0,失敗返回-1。

NAME

termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - 獲取和設置終端屬性,行控制,獲取和設置波特率

SYNOPSIS 總覽

#include <termios.h>
#include <unistd.h>

int tcgetattr(intfd, struct termios *termios_p);

int tcsetattr(intfd, intoptional_actions, struct termios *termios_p);

int tcsendbreak(intfd, intduration);

int tcdrain(intfd);

int tcflush(intfd, intqueue_selector);

int tcflow(intfd, intaction);

int cfmakeraw(struct termios *termios_p);

speed_t cfgetispeed(struct termios *termios_p);

speed_t cfgetospeed(struct termios *termios_p);

int cfsetispeed(struct termios *termios_p, speed_tspeed);

int cfsetospeed(struct termios *termios_p, speed_tspeed);

DESCRIPTION 描述

termios 函數族提供了一個常規的終端接口,用于控制非同步通信端口。

這里描述的大部分屬性有一個termios_p類型的參數,它是指向一個termios結構的指針。這個結構包含了至少下列成員:

tcflag_t c_iflag;      /* 輸入模式 */
tcflag_t c_oflag; /* 輸出模式 */
tcflag_t c_cflag; /* 控制模式 */
tcflag_t c_lflag; /* 本地模式 */
cc_t c_cc[NCCS]; /* 控制字符 */

c_iflag標志常量:

IGNBRK忽略輸入中的 BREAK 狀態。BRKINT如果設置了IGNBRK,將忽略 BREAK。如果沒有設置,但是設置了BRKINT,那么 BREAK 將使得輸入和輸出隊列被刷新,如果終端是一個前臺進程組的控制終端,這個進程組中所有進程將收到SIGINT信號。如果既未設置IGNBRK也未設置BRKINT,BREAK 將視為與 NUL 字符同義,除非設置了PARMRK,這種情況下它被視為序列 /377 /0 /0。IGNPAR忽略楨錯誤和奇偶校驗錯。PARMRK如果沒有設置IGNPAR,在有奇偶校驗錯或楨錯誤的字符前插入 /377 /0。如果既沒有設置IGNPAR也沒有設置PARMRK,將有奇偶校驗錯或楨錯誤的字符視為 /0。INPCK啟用輸入奇偶檢測。ISTRIP去掉第八位。INLCR將輸入中的 NL 翻譯為 CR。IGNCR忽略輸入中的回車。ICRNL將輸入中的回車翻譯為新行 (除非設置了IGNCR)。IUCLC(不屬于 POSIX) 將輸入中的大寫字母映射為小寫字母。IXON啟用輸出的 XON/XOFF 流控制。IXANY(不屬于 POSIX.1;XSI) 允許任何字符來重新開始輸出。(?)IXOFF啟用輸入的 XON/XOFF 流控制。IMAXBEL(不屬于 POSIX) 當輸入隊列滿時響零。Linux 沒有實現這一位,總是將它視為已設置。

POSIX.1 中定義的c_oflag標志常量:

OPOST啟用具體實現自行定義的輸出處理。

其余c_oflag標志常量定義在 POSIX 1003.1-2001 中,除非另外說明。

OLCUC(不屬于 POSIX) 將輸出中的小寫字母映射為大寫字母。ONLCR(XSI) 將輸出中的新行符映射為回車-換行。OCRNL將輸出中的回車映射為新行符ONOCR不在第 0 列輸出回車。ONLRET不輸出回車。OFILL發送填充字符作為延時,而不是使用定時來延時。OFDEL(不屬于 POSIX) 填充字符是 ASCII DEL (0177)。如果不設置,填充字符則是 ASCII NUL。NLDLY新行延時掩碼。取值為NL0NL1CRDLY回車延時掩碼。取值為CR0,CR1,CR2, 或CR3TABDLY水平跳格延時掩碼。取值為TAB0,TAB1,TAB2,TAB3(或XTABS)。取值為 TAB3,即 XTABS,將擴展跳格為空格 (每個跳格符填充 8 個空格)。(?)BSDLY回退延時掩碼。取值為BS0BS1。(從來沒有被實現過)VTDLY豎直跳格延時掩碼。取值為VT0VT1FFDLY進表延時掩碼。取值為FF0FF1

c_cflag標志常量:

CBAUD(不屬于 POSIX) 波特率掩碼 (4+1 位)。CBAUDEX(不屬于 POSIX) 擴展的波特率掩碼 (1 位),包含在 CBAUD 中。

(POSIX 規定波特率存儲在 termios 結構中,并未精確指定它的位置,而是提供了函數cfgetispeed()cfsetispeed()來存取它。一些系統使用c_cflag中 CBAUD 選擇的位,其他系統使用單獨的變量,例如sg_ispeedsg_ospeed。)

CSIZE字符長度掩碼。取值為CS5,CS6,CS7, 或CS8CSTOPB設置兩個停止位,而不是一個。CREAD打開接受者。PARENB允許輸出產生奇偶信息以及輸入的奇偶校驗。PARODD輸入和輸出是奇校驗。HUPCL在最后一個進程關閉設備后,降低 modem 控制線 (掛斷)。(?)CLOCAL忽略 modem 控制線。LOBLK(不屬于 POSIX) 從非當前 shell 層阻塞輸出(用于shl)。(?)CIBAUD(不屬于 POSIX) 輸入速度的掩碼。CIBAUD 各位的值與 CBAUD 各位相同,左移了 IBSHIFT 位。CRTSCTS(不屬于 POSIX) 啟用 RTS/CTS (硬件) 流控制。

c_lflag標志常量:

ISIG當接受到字符 INTR, QUIT, SUSP, 或 DSUSP 時,產生相應的信號。ICANON啟用標準模式 (canonical mode)。允許使用特殊字符 EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS, 和 WERASE,以及按行的緩沖。XCASE(不屬于 POSIX; Linux 下不被支持) 如果同時設置了ICANON,終端只有大寫。輸入被轉換為小寫,除了以 / 前綴的字符。輸出時,大寫字符被前綴 /,小寫字符被轉換成大寫。ECHO回顯輸入字符。ECHOE如果同時設置了ICANON,字符 ERASE 擦除前一個輸入字符,WERASE 擦除前一個詞。ECHOK如果同時設置了ICANON,字符 KILL 刪除當前行。ECHONL如果同時設置了ICANON,回顯字符 NL,即使沒有設置 ECHO。ECHOCTL(不屬于 POSIX) 如果同時設置了ECHO,除了 TAB, NL, START, 和 STOP 之外的 ASCII 控制信號被回顯為 ^X, 這里 X 是比控制信號大 0x40 的 ASCII 碼。例如,字符 0x08 (BS) 被回顯為 ^H。ECHOPRT(不屬于 POSIX) 如果同時設置了ICANONIECHO,字符在刪除的同時被打印。ECHOKE(不屬于 POSIX) 如果同時設置了ICANON,回顯 KILL 時將刪除一行中的每個字符,如同指定了ECHOEECHOPRT一樣。DEFECHO(不屬于 POSIX) 只在一個進程讀的時候回顯。FLUSHO(不屬于 POSIX; Linux 下不被支持) 輸出被刷新。這個標志可以通過鍵入字符 DISCARD 來開關。NOFLSH禁止在產生 SIGINT, SIGQUIT 和 SIGSUSP 信號時刷新輸入和輸出隊列。TOSTOP向試圖寫控制終端的后臺進程組發送 SIGTTOU 信號。PENDIN(不屬于 POSIX; Linux 下不被支持) 在讀入下一個字符時,輸入隊列中所有字符被重新輸出。(bash用它來處理 typeahead)IEXTEN啟用實現自定義的輸入處理。這個標志必須與ICANON同時使用,才能解釋特殊字符 EOL2,LNEXT,REPRINT 和 WERASE,IUCLC標志才有效。

c_cc數組定義了特殊的控制字符。符號下標 (初始值) 和意義為:

VINTR(003, ETX, Ctrl-C, or also 0177, DEL, rubout) 中斷字符。發出 SIGINT 信號。當設置 ISIG 時可被識別,不再作為輸入傳遞。VQUIT(034, FS, Ctrl-/) 退出字符。發出 SIGQUIT 信號。當設置 ISIG 時可被識別,不再作為輸入傳遞。VERASE(0177, DEL, rubout, or 010, BS, Ctrl-H, or also #) 刪除字符。刪除上一個還沒有刪掉的字符,但不刪除上一個 EOF 或行首。當設置 ICANON 時可被識別,不再作為輸入傳遞。VKILL(025, NAK, Ctrl-U, or Ctrl-X, or also @) 終止字符。刪除自上一個 EOF 或行首以來的輸入。當設置 ICANON 時可被識別,不再作為輸入傳遞。VEOF(004, EOT, Ctrl-D) 文件尾字符。更精確地說,這個字符使得 tty 緩沖中的內容被送到等待輸入的用戶程序中,而不必等到 EOL。如果它是一行的第一個字符,那么用戶程序的read()將返回 0,指示讀到了 EOF。當設置 ICANON 時可被識別,不再作為輸入傳遞。VMIN非 canonical 模式讀的最小字符數。VEOL(0, NUL) 附加的行尾字符。當設置 ICANON 時可被識別。VTIME非 canonical 模式讀時的延時,以十分之一秒為單位。VEOL2(not in POSIX; 0, NUL) 另一個行尾字符。當設置 ICANON 時可被識別。VSWTCH(not in POSIX; not supported under Linux; 0, NUL) 開關字符。(只為shl所用。)VSTART(021, DC1, Ctrl-Q) 開始字符。重新開始被 Stop 字符中止的輸出。當設置 IXON 時可被識別,不再作為輸入傳遞。VSTOP(023, DC3, Ctrl-S) 停止字符。停止輸出,直到鍵入 Start 字符。當設置 IXON 時可被識別,不再作為輸入傳遞。VSUSP(032, SUB, Ctrl-Z) 掛起字符。發送 SIGTSTP 信號。當設置 ISIG 時可被識別,不再作為輸入傳遞。VDSUSP(not in POSIX; not supported under Linux; 031, EM, Ctrl-Y) 延時掛起信號。當用戶程序讀到這個字符時,發送 SIGTSTP 信號。當設置 IEXTEN 和 ISIG,并且系統支持作業管理時可被識別,不再作為輸入傳遞。VLNEXT(not in POSIX; 026, SYN, Ctrl-V) 字面上的下一個。引用下一個輸入字符,取消它的任何特殊含義。當設置 IEXTEN 時可被識別,不再作為輸入傳遞。VWERASE(not in POSIX; 027, ETB, Ctrl-W) 刪除詞。當設置 ICANON 和 IEXTEN 時可被識別,不再作為輸入傳遞。VREPRINT(not in POSIX; 022, DC2, Ctrl-R) 重新輸出未讀的字符。當設置 ICANON 和 IEXTEN 時可被識別,不再作為輸入傳遞。VDISCARD(not in POSIX; not supported under Linux; 017, SI, Ctrl-O) 開關:開始/結束丟棄未完成的輸出。當設置 IEXTEN 時可被識別,不再作為輸入傳遞。VSTATUS(not in POSIX; not supported under Linux; status request: 024, DC4, Ctrl-T).

這些符號下標值是互不相同的,除了 VTIME,VMIN 的值可能分別與 VEOL,VEOF 相同。 (在 non-canonical 模式下,特殊字符的含義更改為延時含義。MIN 表示應當被讀入的最小字符數。TIME 是以十分之一秒為單位的計時器。如果同時設置了它們,read 將等待直到至少讀入一個字符,一旦讀入 MIN 個字符或者從上次讀入字符開始經過了 TIME 時間就立即返回。如果只設置了 MIN,read 在讀入 MIN 個字符之前不會返回。如果只設置了 TIME,read 將在至少讀入一個字符,或者計時器超時的時候立即返回。如果都沒有設置,read 將立即返回,只給出當前準備好的字符。) (?)

tcgetattr()得到與fd指向的對象相關的參數,將它們保存于termios_p引用的termios結構中。函數可以從后臺進程中調用;但是,終端屬性可能被后來的前臺進程所改變。

tcsetattr()設置與終端相關的參數 (除非需要底層支持卻無法滿足),使用termios_p引用的termios結構。optional_actions指定了什么時候改變會起作用:

TCSANOW改變立即發生TCSADRAIN改變在所有寫入fd的輸出都被傳輸后生效。這個函數應當用于修改影響輸出的參數時使用。TCSAFLUSH改變在所有寫入fd引用的對象的輸出都被傳輸后生效,所有已接受但未讀入的輸入都在改變發生前丟棄。

tcsendbreak()傳送連續的 0 值比特流,持續一段時間,如果終端使用異步串行數據傳輸的話。如果duration是 0,它至少傳輸 0.25 秒,不會超過 0.5 秒。如果duration非零,它發送的時間長度由實現定義。

如果終端并非使用異步串行數據傳輸,tcsendbreak()什么都不做。

tcdrain()等待直到所有寫入fd引用的對象的輸出都被傳輸。

tcflush()丟棄要寫入 引用的對象,但是尚未傳輸的數據,或者收到但是尚未讀取的數據,取決于queue_selector的值:

TCIFLUSH刷新收到的數據但是不讀TCOFLUSH刷新寫入的數據但是不傳送TCIOFLUSH同時刷新收到的數據但是不讀,并且刷新寫入的數據但是不傳送

tcflow()掛起fd引用的對象上的數據傳輸或接收,取決于action的值:

TCOOFF掛起輸出TCOON重新開始被掛起的輸出TCIOFF發送一個 STOP 字符,停止終端設備向系統傳送數據TCION發送一個 START 字符,使終端設備向系統傳輸數據

打開一個終端設備時的默認設置是輸入和輸出都沒有掛起。

波特率函數被用來獲取和設置termios結構中,輸入和輸出波特率的值。新值不會馬上生效,直到成功調用了tcsetattr()函數。

設置速度為B0使得 modem "掛機"。與B38400相應的實際比特率可以用setserial(8) 調整。

輸入和輸出波特率被保存于termios結構中。

cfmakeraw設置終端屬性如下:

            termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
|INLCR|IGNCR|ICRNL|IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
termios_p->c_cflag &= ~(CSIZE|PARENB);
termios_p->c_cflag |= CS8;

cfgetospeed()返回termios_p指向的termios結構中存儲的輸出波特率

cfsetospeed()設置termios_p指向的termios結構中存儲的輸出波特率為speed。取值必須是以下常量之一:

        B0
B50
B75
B110
B134
B150
B200
B300
B600
B1200
B1800
B2400
B4800
B9600
B19200
B38400
B57600
B115200
B230400

零值B0用來中斷連接。如果指定了 B0,不應當再假定存在連接。通常,這樣將斷開連接。CBAUDEX是一個掩碼,指示高于 POSIX.1 定義的速度的那一些 (57600 及以上)。因此,B57600&CBAUDEX為非零。

cfgetispeed()返回termios結構中存儲的輸入波特率。

cfsetispeed()設置termios結構中存儲的輸入波特率為speed。如果輸入波特率被設為0,實際輸入波特率將等于輸出波特率。

RETURN VALUE 返回值

cfgetispeed()返回termios結構中存儲的輸入波特率。

cfgetospeed()返回termios結構中存儲的輸出波特率。

其他函數返回:

0成功-1失敗,并且為errno置值來指示錯誤。

注意tcsetattr()返回成功,如果任何所要求的修改可以實現的話。因此,當進行多重修改時,應當在這個函數之后再次調用tcgetattr()來檢測是否所有修改都成功實現。

NOTES 注意

Unix V7 以及很多后來的系統有一個波特率的列表,在十四個值 B0, ..., B9600 之后可以看到兩個常數 EXTA, EXTB ("External A" and "External B")。很多系統將這個列表擴展為更高的波特率。

tcsendbreak中非零的duration有不同的效果。SunOS 指定中斷duration*N秒,其中N至少為 0.25,不高于 0.5 。Linux, AIX, DU, Tru64 發送duration微秒的 break 。FreeBSD, NetBSD, HP-UX 以及 MacOS 忽略duration的值。在 Solaris 和 Unixware 中,tcsendbreak搭配非零的duration效果類似于tcdrain

所有的范例來源自miniterm.c. The type ahead 暫存器被限制在 255 個字元, 就跟標準輸入程序的最大字串長度相同 ().

參考程序碼中的注解它會解釋不同輸入模式的使用. 我希望這些程序碼都能被了解. 標準輸入程序的程序范例的注解寫得最好, 其它的范例都只在不同于其它范例的地方做注解.

敘述不是很完整, 但可以激勵你對這范例做實驗, 以延生出合于你所需應用程序的最佳解.

別忘記要把序列埠的權限設定正確 (也就是:chmod a+rw /dev/ttyS1)!

3.1 標準輸入程序

#include 
#include
#include
#include
#include

/* 鮑率設定被定義在 , 這在 被引入 */
#define BAUDRATE B38400
/* 定義正確的序列埠 */
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX 系統兼容 */

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

main()
{
int fd,c, res;
struct termios oldtio,newtio;
char buf[255];
/*
開啟數據機裝置以讀取并寫入而不以控制 tty 的模式
因為我們不想程序在送出 CTRL-C 后就被殺掉.
*/
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }

tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設定 */
bzero(&newtio, sizeof(newtio)); /* 清除結構體以放入新的序列埠設定值 */

/*
BAUDRATE: 設定 bps 的速度. 你也可以用 cfsetispeed 及 cfsetospeed 來設定.
CRTSCTS : 輸出資料的硬件流量控制 (只能在具完整線路的纜線下工作
參考 Serial-HOWTO 第七節)
CS8 : 8n1 (8 位元, 不做同位元檢查,1 個終止位元)
CLOCAL : 本地連線, 不具數據機控制功能
CREAD : 致能接收字元
*/
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

/*
IGNPAR : 忽略經同位元檢查后, 錯誤的位元組
ICRNL : 比 CR 對應成 NL (否則當輸入信號有 CR 時不會終止輸入)
在不然把裝置設定成 raw 模式(沒有其它的輸入處理)
*/
newtio.c_iflag = IGNPAR | ICRNL;

/*
Raw 模式輸出.
*/
newtio.c_oflag = 0;

/*
ICANON : 致能標準輸入, 使所有回應機能停用, 并不送出信號以叫用程序
*/
newtio.c_lflag = ICANON;

/*
初始化所有的控制特性
預設值可以在 /usr/include/termios.h 找到, 在注解中也有,
但我們在這不需要看它們
*/
newtio.c_cc[VINTR] = 0; /* Ctrl-c */
newtio.c_cc[VQUIT] = 0; /* Ctrl-/ */
newtio.c_cc[VERASE] = 0; /* del */
newtio.c_cc[VKILL] = 0; /* @ */
newtio.c_cc[VEOF] = 4; /* Ctrl-d */
newtio.c_cc[VTIME] = 0; /* 不使用分割字元組的計時器 */
newtio.c_cc[VMIN] = 1; /* 在讀取到 1 個字元前先停止 */
newtio.c_cc[VSWTC] = 0; /* '/0' */
newtio.c_cc[VSTART] = 0; /* Ctrl-q */
newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
newtio.c_cc[VEOL] = 0; /* '/0' */
newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
newtio.c_cc[VEOL2] = 0; /* '/0' */

/*
現在清除數據機線并啟動序列埠的設定
*/
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);

/*
終端機設定完成, 現在處理輸入信號
在這個范例, 在一行的開始處輸入 'z' 會退出此程序.
*/
while (STOP==FALSE) { /* 回圈會在我們發出終止的信號后跳出 */
/* 即使輸入超過 255 個字元, 讀取的程序段還是會一直等到行終結符出現才停止.
如果讀到的字元組低于正確存在的字元組, 則所剩的字元會在下一次讀取時取得.
res 用來存放真正讀到的字元組個數 */
res = read(fd,buf,255);
buf[res]=0; /* 設定字串終止字元, 所以我們能用 printf */
printf(":%s:%d/n", buf, res);
if (buf[0]=='z') STOP=TRUE;
}
/* 回存舊的序列埠設定值 */
tcsetattr(fd,TCSANOW,&oldtio);
}

3.2 非標準輸入程序

在非標準的輸入程序模式下, 輸入的資料不會被組合成一行而輸入后的處理功能 (清除, 殺掉, 刪除, 等等.) 都不能使用. 這個模式有兩個功能控制參數:c_cc[VTIME]設定字元輸入時間計時器, 及c_cc[VMIN]設定滿足讀取功能的最低字元接收個數.

如果 MIN > 0 且 TIME = 0, MIN 設定為滿足讀取功能的最低字元接收個數. 由于 TIME 是 零, 所以計時器將不被使用.

如果 MIN = 0 且 TIME > 0, TIME 將被當做逾時設定值. 滿足讀取功能的情況為讀取到單一字元, 或者超過 TIME 所定義的時間 (t = TIME *0.1 s). 如果超過 TIME 所定義的時間, 則不會傳回任何字元.

如果 MIN > 0 且 TIME > 0, TIME 將被當做一個分割字元組的計時器. 滿足讀取功能的條件為接收到 MIN 個數的字元, 或兩個字元的間隔時間超過 TIME 所定義的值. 計時器會在每讀到一個字元后重新計時, 且只會在第一個字元收到后才會啟動.

如果 MIN = 0 且 TIME = 0, 讀取功能就馬上被滿足. 目前所存在的字元組個數, 或者 將回傳的字元組個數. 根據 Antonino (參考 貢獻) 所說, 你可以用fcntl(fd, F_SETFL, FNDELAY);在讀取前得到相同的結果.

藉由修改newtio.c_cc[VTIME]newtio.c_cc[VMIN]上述的模式就可以測試了.

#include 
#include
#include
#include
#include

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX 系統兼容 */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

main()
{
int fd,c, res;
struct termios oldtio,newtio;
char buf[255];

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }

tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設定 */

bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;

/* 設定輸入模式 (非標準型, 不回應,...) */
newtio.c_lflag = 0;

newtio.c_cc[VTIME] = 0; /* 不使用分割字元組計時器 */
newtio.c_cc[VMIN] = 5; /* 在讀取到 5 個字元前先停止 */

tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);


while (STOP==FALSE) { /* 輸入回圈 */
res = read(fd,buf,255); /* 在輸入 5 個字元后即返回 */
buf[res]=0; /* 所以我們能用 printf... */
printf(":%s:%d/n", buf, res);
if (buf[0]=='z') STOP=TRUE;
}
tcsetattr(fd,TCSANOW,&oldtio);
}

3.3 非同步式輸入

#include 
#include
#include
#include
#include
#include

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX 系統兼容 */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

void signal_handler_IO (int status); /* 定義信號處理程序 */
int wait_flag=TRUE; /* 沒收到信號的話就會是 TRUE */

main()
{
int fd,c, res;
struct termios oldtio,newtio;
struct sigaction saio; /* definition of signal action */
char buf[255];

/* 開啟裝置為 non-blocking (讀取功能會馬上結束返回) */
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(MODEMDEVICE); exit(-1); }

/* 在使裝置非同步化前, 安裝信號處理程序 */
saio.sa_handler = signal_handler_IO;
saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);

/* 允許行程去接收 SIGIO 信號*/
fcntl(fd, F_SETOWN, getpid());
/* 使文檔ake the file descriptor 非同步 (使用手冊上說只有 O_APPEND 及
O_NONBLOCK, 而 F_SETFL 也可以用...) */
fcntl(fd, F_SETFL, FASYNC);

tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設定值 */
/* 設定新的序列埠為標準輸入程序 */
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);

/* 等待輸入信號的回圈. 很多有用的事我們將在這做 */
while (STOP==FALSE) {
printf("./n");usleep(100000);
/* 在收到 SIGIO 后, wait_flag = FALSE, 輸入信號存在則可以被讀取 */
if (wait_flag==FALSE) {
res = read(fd,buf,255);
buf[res]=0;
printf(":%s:%d/n", buf, res);
if (res==1) STOP=TRUE; /* 如果只輸入 CR 則停止回圈 */
wait_flag = TRUE; /* 等待新的輸入信號 */
}
}
/* 回存舊的序列埠設定值 */
tcsetattr(fd,TCSANOW,&oldtio);
}

/***************************************************************************
* 信號處理程序. 設定 wait_flag 為 FALSE, 以使上述的回圈能接收字元 *
***************************************************************************/

void signal_handler_IO (int status)
{
printf("received SIGIO signal./n");
wait_flag = FALSE;
}

3.4 等待來自多個信號來源的輸入

這一段很短. 它只能被拿來當成寫程序時的提示, 故范例程序也很簡短. 但這個范例不只能用在序列埠上, 還可以用在被當成文檔來使用的裝置上.

select 呼叫及伴隨它所引發的巨集共用fd_set.fd_set則是一個位元陣列, 而其中每一個位元代表一個有效的文檔敘述結構.select呼叫接受一個有效的文檔敘述結構并傳回fd_set位元陣列, 而該位元陣列中若有某一個位元為 1, 就表示相對映的文檔敘述結構的文檔發生了輸入, 輸出或有例外事件. 而這些巨集提供了所有處理fd_set的功能. 亦可參考手冊 select(2).

#include 
#include
#include

main()
{
int fd1, fd2; /* 輸入源 1 及 2 */
fd_set readfs; /* 文檔敘述結構設定 */
int maxfd; /* 最大可用的文檔敘述結構 */
int loop=1; /* 回圈在 TRUE 時成立 */

/* open_input_source 開啟一個裝置, 正確的設定好序列埠,
并回傳回此文檔敘述結構體 */
fd1 = open_input_source("/dev/ttyS1"); /* COM2 */
if (fd1<0) exit(0);
fd2 = open_input_source("/dev/ttyS2"); /* COM3 */
if (fd2<0) exit(0);
maxfd = MAX (fd1, fd2)+1; /* 測試最大位元輸入 (fd) */

/* 輸入回圈 */
while (loop) {
FD_SET(fd1, &readfs); /* 測試輸入源 1 */
FD_SET(fd2, &readfs); /* 測試輸入源 2 */
/* block until input becomes available */
select(maxfd, &readfs, NULL, NULL, NULL);
if (FD_ISSET(fd1)) /* 如果輸入源 1 有信號 */
handle_input_from_source1();
if (FD_ISSET(fd2)) /* 如果輸入源 2 有信號 */
handle_input_from_source2();
}

}

這個范例程序在等待輸入信號出現前, 不能確定它會停頓下來. 如果你需要在輸入時加入逾時功能, 只需把 select 呼叫換成:

int res;
struct timeval Timeout;

/* 設定輸入回圈的逾時值 */
Timeout.tv_usec = 0; /* 毫秒 */
Timeout.tv_sec = 1; /* 秒 */
res = select(maxfd, &readfs, NULL, NULL, &Timeout);
if (res==0)
/* 文檔敘述結構數在 input = 0 時, 會發生輸入逾時. */

這個程序會在 1 秒鐘后逾時. 如果超過時間, select 會傳回 0, 但是應該留意Timeout的時間遞減是由select所等待輸入信號的時間為基準. 如果逾時的值是 0, select 會馬上結束返回.

Linux 環境下使用RS-232接口
RS是英文 "推薦標準"的縮寫
232為標識號
RS-485
串口通信表示計算機一次傳送一個位的數據,
當使用串行通信時,每個字的數據是一個位一個位的傳輸或接收的,
每個位不是高電平,就是低電平.
串行通信的速率通常是使用"位/每秒"的方式來表示的,即波特率。
全雙工--計算機可以同時收發數據,
它有兩個獨立的數據通道,一個輸入,一個輸出,
半雙工意味著計算機不能同時收發信息,
只能有一人通道進行通信.
流控:
通常,當數據在兩個串行接口之間進行傳輸時需要對其進行控制.
這通常依賴于串行通信連接的各種規定,
對異步數據傳輸的控制有兩種方法.
一種叫:“軟件”流控 。
一種叫: “硬件"流控 。
串口設備:
打開一個串行口
#include
#include
#include
#include // 文件控制定義
#include
#include //POSIX終端控制定義
/*
* open_port() --打開串行口
*
* 成功的話,返回文件描述符,錯誤則返回 -1.
*/
int open_port(void)
{
int fd;
fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
if (fd == -1)
{
/*無法打開串口*/
perror("open_port : Unable to open /dev/ttyS0");
}
else
fcntl(fd,F_SETFL,0);
return (fd);
}
//O_NOCTTY 標志 ,該程序不想成為此端口的“控制終端"。
如果沒有強調這一點,
//O_NDELAY標志 , 標志告訴Linux ,該程序并不關注DCD信叼線所處的狀態,
即不管另外一端的設備是在運行還是被掛起。如果沒有指定該標志,那么程序就會被設置睡
眠狀態,
(2)向端口寫數據
向端口寫數據是很容易的,只要使用write()系統調用就可以了。
例如:
n=write(fd,"ATZ/r",4);
if (n<0)
fputs("write() of 4 bytes failed!/n",stderr);
write函數返回發送數據的個數,如果出現錯誤,則返回 -1。
(3) 讀端口數據
從端口讀數據則需要些技巧。如果在原始數據的模式下對端口進行操作,
read()系統調用將返回串行口輸入緩沖區中所有的字符數據,不管有多少,
如果沒有數據,那么該調用將被阻塞.處于等待狀態,直到有字符輸入,
或者到了規定的時限和出現錯誤為止,
通過以下方法,能使read函數立即返回。
fcntl(fd,F_SETFL,FNDELAY);
FNDELAY 函數使read函數在端口沒月字符存在的情況下,立刻返回0,
如果要恢復正常(阻塞)狀態,可以調用fcntl()函數,不要FNDELAY參數,
如下所示:
fcntl(Fd,F_SETFL,0);
在使用O_NDELAY參數打開串行口后,同樣與使用了該函數調用。
fcntl(fd,F_SETFL,0);
POSIX終端接口
串口,波特率,字符大小等,
POSIX函數是 tcgetattr()和tcsetattr()
獲取和設置終端的屬性,
可以提供 structrure termios的指針

總結

以上是生活随笔為你收集整理的详解linux下的串口通讯开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

999视频精品 | 国产字幕av | 99爱视频在线观看 | 久久99国产精品自在自在app | 色网站免费在线观看 | 久久精品综合 | 久久久激情视频 | 日韩三级视频在线看 | 日韩a级黄色 | 五月婷婷久久综合 | 久久精品三级 | 亚洲电影图片小说 | 日韩综合一区二区 | 97精品久久人人爽人人爽 | 免费色黄| 成人天堂网 | 欧美精品一区二区蜜臀亚洲 | 亚洲一级性 | 欧美做受高潮 | 深爱婷婷激情 | 久久免费观看少妇a级毛片 久久久久成人免费 | 久久成人人人人精品欧 | 美腿丝袜一区二区三区 | 免费看的黄网站软件 | 99精品视频精品精品视频 | 日韩天堂在线观看 | 在线播放 日韩专区 | 久久超碰免费 | 一级片视频在线 | 久久观看| 国产午夜精品在线 | 六月色婷 | 国产手机av| 日本中文字幕在线播放 | 福利视频一二区 | 国内精品在线一区 | 久草资源在线 | 亚洲视频在线观看免费 | 综合久久久 | 免费日韩一区二区 | www.超碰| 在线观看激情av | 日韩毛片在线一区二区毛片 | 日韩精品在线免费观看 | 日韩在线观看视频网站 | 最近中文字幕国语免费av | 日韩精品一区在线观看 | 一本一本久久a久久精品综合妖精 | 国产精品永久久久久久久久久 | 毛片网站免费在线观看 | 一区二区三区免费在线观看视频 | 日韩网站在线观看 | 深爱激情五月网 | 最近最新最好看中文视频 | 97超级碰碰| 亚洲精品在线观看不卡 | 麻豆一区在线观看 | 亚洲特级片 | 美女视频黄免费的久久 | 国产在线不卡视频 | 久久成人午夜 | 久久夜视频 | 久操中文字幕在线观看 | 亚洲干视频在线观看 | 亚洲色综合 | 日韩视频一 | 亚洲最大av在线播放 | 亚洲男女精品 | 午夜视频在线观看一区二区三区 | 国产精品va最新国产精品视频 | 99 色| 草莓视频在线观看免费观看 | 成人久久18免费网站麻豆 | 久久久久久国产精品美女 | 久久激情小视频 | 最近中文字幕在线中文高清版 | 六月婷婷网 | 激情欧美一区二区免费视频 | 西西4444www大胆视频 | 成人免费在线看片 | 精品国产三级 | 日韩亚洲国产精品 | 色婷婷国产在线 | 午夜av在线电影 | 久久久久久97三级 | 成人国产精品免费 | 国产自在线观看 | 欧美日韩亚洲第一页 | 久草久草视频 | 五月天国产精品 | 色多多视频在线观看 | 99久久精品免费看国产免费软件 | 精品在线看| 免费网站黄 | 成人黄色电影在线播放 | 在线免费观看黄 | 亚洲天堂首页 | 久久字幕精品一区 | 97精品国产91久久久久久 | 中文字幕精品在线 | 国产成人在线网站 | 久草网在线视频 | 国产精品久久久久久一区二区 | 在线小视频 | 亚洲精品婷婷 | 麻豆超碰 | 国产精品丝袜久久久久久久不卡 | 日韩中文在线字幕 | 婷婷av电影| 精品国产诱惑 | 亚洲最大免费成人网 | 黄色大片日本免费大片 | 毛片视频网址 | 国产精品黄色在线观看 | 狠狠色丁香久久综合网 | 亚洲a免费| av网站大全免费 | 国产一级二级在线观看 | 欧美日韩一区二区三区在线观看视频 | 天堂av最新网址 | 久久视频网址 | 精品一区免费 | 色诱亚洲精品久久久久久 | 91成人精品 | 91成人免费在线视频 | 丰满少妇一级片 | 中文字幕亚洲情99在线 | 亚洲欧美精品在线 | 久久久久综合网 | av在线激情| 99热99| 久久精品99国产 | 午夜性福利 | 日本aaaa级毛片在线看 | 亚洲va在线va天堂va偷拍 | 亚洲精品在线观看中文字幕 | 日韩aa视频| 96在线 | 亚洲一区不卡视频 | 久久精品日韩 | 亚洲日本va午夜在线影院 | 夜添久久精品亚洲国产精品 | 狠狠狠狠狠干 | 亚洲精品国产精品乱码不99热 | 精品无人国产偷自产在线 | 婷婷精品国产一区二区三区日韩 | 日韩午夜一级片 | 黄在线免费观看 | 午夜天天操 | 亚洲三级影院 | 亚洲精品视频在线免费播放 | 欧美激情精品久久 | 毛片网在线播放 | 啪啪av在线| 久久不色 | 人人爽人人片 | 免费下载高清毛片 | 免费人成网 | 国产中文字幕网 | 99久久精品国产一区二区三区 | 超碰人人草 | 精品国产1区二区 | 国产一级片观看 | 欧美激情精品久久久久久免费 | 午夜免费视频网站 | 色七七亚洲影院 | 日日夜夜狠狠操 | 97超碰在线免费观看 | 亚洲aⅴ在线 | 国产精品国产三级在线专区 | 国产视频欧美视频 | 亚洲欧美日韩国产一区二区 | 亚洲丁香久久久 | 久久成人亚洲欧美电影 | 四虎免费在线观看视频 | 国产裸体无遮挡 | 精品产品国产在线不卡 | 麻豆视频国产在线观看 | 在线免费观看黄色 | 久久久人人爽 | 婷婷综合五月天 | 日日干狠狠操 | 久草视频国产 | 成人免费毛片aaaaaa片 | 欧美日韩精品区 | 国产不卡一二三区 | 91天堂在线观看 | 欧美激情综合五月色丁香 | 国产成人综合图片 | 欧美另类一二三四区 | 五月婷婷开心中文字幕 | 国产精品一区一区三区 | 欧美专区日韩专区 | 99久久精品免费看国产免费软件 | 99精品视频精品精品视频 | 欧美色图视频一区 | 99视频精品视频高清免费 | 国产精品露脸在线 | 国产一级免费av | 97久久精品午夜一区二区 | 999久久久久久久久久久 | 美女视频久久 | 日韩视频精品在线 | 国产亚洲精品成人av久久ww | 日韩午夜电影 | 伊人中文字幕在线 | 欧美另类tv| 欧美另类xxxxx | 亚洲视频一区二区三区在线观看 | 精品一区中文字幕 | 一区二区三区电影在线播 | 精品国模一区二区 | 日韩一级片观看 | 97在线超碰 | 亚洲专区在线 | av成年人电影 | 日韩av手机在线看 | 天天干天天摸天天操 | 国产一区二区在线精品 | 99精品免费久久久久久日本 | 色姑娘综合天天 | 精品亚洲网 | 国产综合视频在线观看 | 国产老太婆免费交性大片 | 天天操夜夜操国产精品 | 极品美女被弄高潮视频网站 | 成人h视频在线播放 | 天天色宗合 | 免费成人在线观看视频 | 国产黄色免费观看 | 久久久精品日本 | 天天干,天天射,天天操,天天摸 | 中文字幕第 | 狠狠躁日日躁狂躁夜夜躁av | 精品中文字幕在线播放 | av在线电影免费观看 | 99久热在线精品视频 | 日韩黄色网络 | 欧美一级视频免费 | 国产精品九九视频 | 西西444www| 国产亚洲精品久久久久久电影 | 国产精品白虎 | 久久嗨| 国产黄色成人 | 久久福利在线 | 成人小视频在线观看免费 | 91porny九色91啦中文 | 91激情视频在线 | 97超碰在线久草超碰在线观看 | 91精品国产91久久久久久三级 | 黄色1级毛片 | 国产精品久久久久久久av电影 | 午夜精品久久久久久久99婷婷 | 亚洲精品a区 | 久久精品男人的天堂 | 精品一区二区综合 | 午夜精品一区二区三区在线 | 9在线观看免费高清完整版 玖玖爱免费视频 | 黄网站色视频免费观看 | 99精品久久99久久久久 | 午夜色大片在线观看 | 欧美日韩国产一区二区在线观看 | 久久久国产一区二区三区四区小说 | 国产日产亚洲精华av | 一区二区三区国产精品 | 久久精品99久久久久久2456 | 亚洲国产网站 | 亚洲国产高清在线 | 国产99视频在线观看 | 一区二区三区免费在线 | 草久久av | 日韩av综合网站 | 韩国一区在线 | 奇米7777狠狠狠琪琪视频 | 亚洲码国产日韩欧美高潮在线播放 | 在线日韩中文 | 亚州欧美视频 | 中文字幕在线观看完整 | 国产色拍 | 日韩激情片在线观看 | 最新中文字幕在线观看视频 | 日b视频在线观看网址 | 国产在线视频不卡 | 久久电影日韩 | 成年人免费观看在线视频 | 亚洲va在线va天堂 | 国产一区高清在线 | 干干干操操操 | av888av.com| 亚洲综合激情五月 | 欧美一级性 | 欧美日韩在线观看一区二区三区 | 成片视频在线观看 | 成人免费观看a | 午夜精品视频在线 | 免费精品视频在线观看 | 国产精品免费小视频 | 伊人婷婷激情 | 日韩在线国产精品 | 精品久久久久一区二区国产 | 亚洲国内精品视频 | 天天做天天爱天天综合网 | 亚洲专区免费观看 | 九九视频精品免费 | 日韩精品视频网站 | 精品久久久久亚洲 | 日韩理论在线播放 | 久久久久国产精品免费网站 | 在线观看日本高清mv视频 | 欧美日韩国产免费视频 | 色99视频| 国产精品久久一区二区三区, | www操操操 | 天堂入口网站 | 综合久久影院 | 日韩精品不卡 | 欧美日本一二三 | 狠狠干电影 | 四虎视频 | 欧美午夜理伦三级在线观看 | 久久在线电影 | av在线免费在线观看 | 在线观看免费 | 亚洲理论电影 | 视频三区| 久草影视在线 | 久久久91精品国产一区二区精品 | 国产精品 9999 | 91视频在线| 久久国产精品精品国产色婷婷 | 色诱亚洲精品久久久久久 | 日本天天色 | 国产日韩欧美在线播放 | 99久久999久久久精玫瑰 | www.天天色.com | 在线视频欧美亚洲 | 四虎永久视频 | 99国产精品视频免费观看一公开 | 玖玖在线视频观看 | 免费国产一区二区视频 | 亚洲欧美观看 | aaa毛片视频 | av成人亚洲 | 中文字幕在线播放日韩 | 99性视频 | 国产中文字幕在线免费观看 | 亚洲日本激情 | 欧美午夜精品久久久久久孕妇 | 亚洲专区在线 | 黄色三级免费 | 国产精品自产拍在线观看蜜 | 精品久久久久久久久久 | 日韩久久精品 | 欧美老人xxxx18 | 亚洲毛片视频 | 国内精品久久久久久中文字幕 | 欧美性成人 | 四虎国产免费 | 色九九在线 | 美国av大片| 香蕉视频在线播放 | 免费在线观看视频a | 日韩av资源在线观看 | 国产在线高清精品 | 99热这里精品 | 国产精品日韩高清 | 国产v在线 | 久久国色夜色精品国产 | 日日夜夜天天干 | 国产视频综合在线 | wwwwww黄 | 国产精久久久久久妇女av | 日韩v欧美v日本v亚洲v国产v | 又色又爽又黄 | 毛片永久新网址首页 | 免费看v片 | 日日爽 | 日本三级不卡视频 | 国产精品免费不卡 | 在线免费三级 | 免费高清在线视频一区· | 国产精品正在播放 | 日韩在线观看你懂的 | 国产成人1区 | 91精品网站在线观看 | 五月婷婷综合在线 | 992tv在线观看网站 | 免费在线观看的av网站 | 一区二区三区久久精品 | 欧美三级高清 | 欧美亚洲专区 | 久久久久免费精品国产 | 日韩欧美高清在线 | 国产第一页福利影院 | 欧美xxxxx在线视频 | 欧美日韩国产在线观看 | 美女网站色免费 | 青青久草在线 | 97成人在线免费视频 | 天天干天天上 | 久久深夜 | 99av国产精品欲麻豆 | 久久久精品成人 | 区一区二区三区中文字幕 | 久色 网 | 探花在线观看 | 视频在线99 | 二区三区在线观看 | 国产视频91在线 | 欧美a级在线免费观看 | 91免费黄视频 | 伊人天天干| 最近高清中文在线字幕在线观看 | 色网站在线 | 免费能看的黄色片 | 亚洲精品国久久99热 | 999在线精品| 日韩动态视频 | 日韩69av | 免费av电影网站 | 国产精品嫩草影院99网站 | 中文字幕精品一区二区三区电影 | 成人免费观看完整版电影 | 免费观看的av| 91精品91 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久精品免视看 | 日韩a级黄色 | 国产 一区二区三区 在线 | 久久婷亚洲五月一区天天躁 | 玖玖视频国产 | 亚洲最大av网站 | 久久99精品国产麻豆宅宅 | 在线看黄色的网站 | 婷婷色九月| 国产成视频在线观看 | 又爽又黄在线观看 | 亚洲成色777777在线观看影院 | 成人午夜免费剧场 | 国产精品第一页在线 | 中文字幕精品一区 | 亚洲精品色视频 | 91成人在线观看高潮 | 奇米影视8888在线观看大全免费 | 亚洲国产成人av网 | 国产精品久久二区 | 国产一二三区在线观看 | 色综合网在线 | 激情综合色综合久久综合 | 国产午夜精品一区二区三区欧美 | 中文av一区二区 | 日本黄色一级电影 | 九九久久久 | 人人草网站 | 中文字幕精品一区久久久久 | 亚洲色五月 | 91九色丨porny丨丰满6 | 午夜国产在线 | 久久精品一区二区国产 | 免费久久久 | 日韩福利在线观看 | 国产高清视频在线 | 日韩精品在线看 | 久久精品国产久精国产 | 伊人天天综合 | 天天操夜夜曰 | 国产视频97 | 国产午夜精品久久 | 国产一区免费看 | 亚洲精品国精品久久99热一 | 久久久精品综合 | 干天天| 国产一区欧美日韩 | 国产小视频在线免费观看视频 | 中文字幕免费成人 | 色人久久| 精品视频123区在线观看 | 中文字幕国产亚洲 | a在线免费观看视频 | 一区二区三区三区在线 | 水蜜桃亚洲一二三四在线 | 国产中文字幕一区二区 | 中文字幕国产视频 | 国内精品视频久久 | 国产a免费| 91麻豆精品国产91久久久久久久久 | 国产精品无av码在线观看 | 亚洲精品中文在线观看 | 91久久一区二区 | 精品国产伦一区二区三区观看说明 | 97超碰福利久久精品 | 999男人的天堂 | 久久免费福利视频 | 日韩视频免费观看高清完整版在线 | 午夜91在线 | 99九九99九九九视频精品 | 丝袜一区在线 | 国产色婷婷精品综合在线手机播放 | 中文字幕日韩一区二区三区不卡 | 久久人人97超碰com | 免费观看一级 | 在线看国产日韩 | www.神马久久| 日日夜夜网站 | 久久久久久久久久久久久久免费看 | 亚洲午夜精品一区二区三区电影院 | 国产理论免费 | 永久免费毛片在线观看 | 黄色中文字幕在线 | 国产精品视频线看 | 欧美日韩性视频 | 日本天天操 | 91视频免费看片 | 精品国产黄色片 | 欧美性色综合 | 婷婷中文字幕在线观看 | 久久国产精品第一页 | 91九色综合| 久久精品99视频 | 人人人爽| 国产精品高潮久久av | 五月婷婷久 | 亚洲国产精品久久久久婷婷884 | 欧美日韩国产精品爽爽 | 黄网站色视频免费观看 | 天天干天天操av | 亚洲黄色免费在线看 | 亚洲草视频 | 97超碰国产精品女人人人爽 | 国内久久久久久 | 黄色网址在线播放 | 午夜av免费看 | 久久久亚洲国产精品麻豆综合天堂 | 日批视频国产 | 涩av在线| 久久精品看 | 在线91网 | 天天色天天操综合 | 黄色电影小说 | 日本在线h| 综合久久精品 | 久久都是精品 | 久久6精品 | 亚洲狠狠操 | 国产99久久久国产精品成人免费 | 中文字幕在线视频第一页 | 欧美激情综合色 | 天天射天天操天天 | 欧美一级激情 | 黄色精品一区 | 久久手机在线视频 | 免费国产ww | 婷婷亚洲综合五月天小说 | 六月丁香社区 | 黄色一区二区在线观看 | 天天摸天天干天天操天天射 | 国产黄a三级三级三级三级三级 | 99视频精品视频高清免费 | 中文字幕一区三区 | 精品国产一区二区三区蜜臀 | 日韩av专区 | 国产在线精品国自产拍影院 | 日韩av中文字幕在线免费观看 | 国产在线视频一区二区三区 | 激情av综合 | 久久爱资源网 | 在线免费观看一区二区三区 | 日本aaaa级毛片在线看 | 免费日韩 | 亚洲一级片在线看 | 欧美99久久| 中文在线a√在线 | 国产色网 | 亚洲不卡在线 | 国产九九九精品视频 | 久久精品在线视频 | 亚洲精品综合欧美二区变态 | 视频一区二区在线观看 | 看片网站黄色 | 91桃色国产在线播放 | 97免费在线视频 | 久久精品视频免费观看 | 天天干婷婷 | 免费av片在线 | 欧美男女爱爱视频 | 91中文在线 | 狠狠gao| a成人v在线 | 天天射天天舔天天干 | 国产性xxxx| 天天操天天射天天爽 | 亚洲在线日韩 | 91久久奴性调教 | 97成人在线观看视频 | 国产分类视频 | 99re国产| 欧美不卡在线 | .精品久久久麻豆国产精品 亚洲va欧美 | 色黄www小说 | 国产精品久久久久久久久费观看 | 黄色成年网站 | 免费看v片网站 | 国产 日韩 欧美 在线 | 一级一片免费看 | 色欲综合视频天天天 | 国产精品一区二区久久精品 | 精品亚洲成人 | a极黄色片 | 超碰人人草 | 日韩电影久久 | 国产黄色成人av | 91男人影院 | 欧美精品国产综合久久 | 久久精品国产99 | 天天摸夜夜操 | 亚洲电影一区二区 | 国产 一区二区三区 在线 | 91精品综合在线观看 | 亚洲精品网站 | 国产精品专区h在线观看 | 国产成人精品av在线 | 国产在线毛片 | 久草在线视频看看 | 久久久久99精品成人片三人毛片 | 日韩com | 欧洲激情综合 | 月下香电影 | 欧美视频一区二 | 美女网站色 | 日韩在线视频网址 | 色噜噜狠狠狠狠色综合 | 国产91精品看黄网站在线观看动漫 | 国产高清不卡一区二区三区 | 日韩免费高清在线观看 | 久久乐九色婷婷综合色狠狠182 | 黄色免费在线视频 | 国产伦理精品一区二区 | 在线亚洲播放 | 久久精品成人 | 91九色国产| 色资源中文字幕 | 91av视频 | 婷婷亚洲综合 | 中文字幕色播 | 99免费在线观看视频 | 日韩精品久久一区二区 | 久草免费在线视频观看 | 色综合狠狠干 | 国产中文在线字幕 | 欧美日韩中文字幕视频 | 999电影免费在线观看 | 激情文学丁香 | 久久久久国产a免费观看rela | 亚洲aⅴ在线 | av888av.com| 国产特级毛片aaaaaa高清 | 欧美国产亚洲精品久久久8v | 日韩丝袜在线观看 | 免费在线播放av电影 | 免费欧美| 中文字幕在线看视频 | 涩五月婷婷 | 国产中文自拍 | 成人av片免费观看app下载 | 国产成人精品综合久久久久99 | 日本久久久久久科技有限公司 | 免费看片网站91 | 最新午夜电影 | 91九色性视频| 毛片99| 天天爽夜夜爽人人爽一区二区 | 国产中文字幕三区 | 国产精品欧美久久久久天天影视 | 一区中文字幕 | 日韩精品视频久久 | 免费的国产精品 | 毛片888| 97精品视频在线播放 | 综合婷婷丁香 | 久久综合久色欧美综合狠狠 | 奇米影音四色 | 97视频在线看 | 久久亚洲精品国产亚洲老地址 | 毛片网在线观看 | 免费视频你懂得 | 婷婷综合国产 | 国产中文字幕在线视频 | 高清免费在线视频 | 国产一区二区三区在线免费观看 | 一区二区三区国产欧美 | 国产黄色在线 | 高清国产午夜精品久久久久久 | 激情五月开心 | 蜜臀久久99精品久久久无需会员 | 日韩久久在线 | 婷婷精品视频 | 日韩在线免费观看视频 | 在线视频欧美日韩 | 日本午夜在线亚洲.国产 | 日批视频在线 | 一级片免费观看 | 欧美少妇xxx | 日韩性久久 | 欧美午夜久久 | 亚洲国产成人久久综合 | 在线观看播放av | avcom在线 | 日韩精品国产一区 | 成年人在线播放视频 | 97干com | 欧美xxxx性xxxxx高清 | 国产视频综合在线 | 伊人网站| 999视频在线播放 | 伊人干综合| 一区二区三区高清在线 | 日韩黄色在线观看 | 最新国产精品久久精品 | 精品综合久久久 | 天天操夜夜做 | 久久深夜 | 日韩1页| 黄色99视频 | 91在线麻豆 | 免费一级日韩欧美性大片 | 在线日韩三级 | 天天操夜操视频 | 久草精品电影 | 国产99精品在线观看 | 在线岛国av| 九月婷婷人人澡人人添人人爽 | 国产 在线 高清 精品 | 91看毛片 | 51精品国自产在线 | 亚洲成人二区 | 韩国中文三级 | 久久久久久久99 | 色综合久久久久网 | 特级西西444www大精品视频免费看 | 久久这里只有精品久久 | 黄色国产高清 | 五月亚洲综合 | 国产精品男女啪啪 | 99久久超碰中文字幕伊人 | 国产精品一区二区久久精品 | 91在线入口 | 91精品国产高清自在线观看 | 网址你懂的在线观看 | 日韩激情视频在线 | 丁香花在线观看免费完整版视频 | 亚洲精品国产欧美在线观看 | 国产黄a三级三级三级三级三级 | 91九色九色 | 亚洲乱码国产乱码精品天美传媒 | 亚洲资源在线 | 毛片在线网 | 国产精品 中文字幕 亚洲 欧美 | 三级av网| 日韩欧美精品一区二区三区经典 | 亚洲国产手机在线 | 亚洲精品黄色片 | 91成人短视频在线观看 | 日韩高清在线一区二区 | 国产精品久久久久国产精品日日 | 欧美日本不卡视频 | 欧美在线你懂的 | 国产中文视频 | 日韩电影在线观看一区二区三区 | 国产色在线,com | 欧美午夜精品久久久久 | 六月丁香社区 | 久久99九九99精品 | 成人一区二区三区在线观看 | 午夜精品一区二区三区在线视频 | 国产黄色片久久久 | 欧美精品一二三 | 香蕉久久久久 | 日韩精品无码一区二区三区 | 91一区一区三区 | 久草在线免 | 成人欧美日韩国产 | 蜜桃av久久久亚洲精品 | 91天天操 | 精品免费观看 | 天天综合色网 | 亚洲精品综合一二三区在线观看 | 国产无套一区二区三区久久 | 夜夜夜夜爽 | 欧美日韩免费在线视频 | 精品国产精品一区二区夜夜嗨 | 在线va视频 | 日本h视频在线观看 | 国产成人黄色在线 | 日韩免费三区 | 最新精品视频在线 | 色婷婷精品 | av片在线看 | 色婷婷狠狠 | 亚洲精品乱码久久久久久蜜桃91 | 色综合天天综合在线视频 | 精品久久一区二区三区 | www.狠狠 | 黄色a级片在线观看 | 黄在线免费观看 | 蜜臀久久99精品久久久无需会员 | 午夜电影 电影 | 国产做a爱一级久久 | 精品久久久久一区二区国产 | 亚洲精品在 | 美女黄久久 | 日日夜夜精品视频天天综合网 | 欧日韩在线视频 | 亚洲自拍av在线 | 精品在线小视频 | 色人久久| 色婷婷狠狠18| 深爱综合网 | av在线免费网| 日日夜夜网站 | 免费高清国产 | 91成人在线网站 | 五月的婷婷| 国产色视频网站2 | 亚洲永久精品在线 | 中国精品一区二区 | 精品国内自产拍在线观看视频 | 天天操天天舔天天干 | 久久xx视频 | 99久久精品国产毛片 | 在线视频免费观看 | 久久综合九色综合欧美就去吻 | 免费看的黄色的网站 | 久久99精品国产99久久 | 蜜臀久久99精品久久久无需会员 | 日日爱网址 | 亚洲影视九九影院在线观看 | 91精品少妇偷拍99 | 久久r精品 | www.在线看片.com| 2024国产在线 | 香蕉网在线 | 成人在线免费看视频 | 一区二精品 | 狠狠干狠狠艹 | 日本黄色一级电影 | 久草香蕉在线视频 | 久久国产免 | 亚州国产精品 | 日韩视频在线观看视频 | 成年人在线观看 | 亚洲久久视频 | 一区二区三区四区久久 | 成人国产精品 | 日韩欧美在线观看一区 | 五月婷婷中文 | 欧美一级片在线免费观看 | www.天天色.com | .国产精品成人自产拍在线观看6 | 91精品久久久久久久99蜜桃 | 久草视频免费看 | 成人免费在线播放视频 | 美女黄频在线观看 | 亚洲狠狠 | 超碰人人乐 | 色综合久久久网 | 婷婷丁香导航 | 欧美日韩精品在线观看 | 911av视频 | 美女黄色网在线播放 | 免费观看性生交大片3 | 日韩欧美91 | 久久久久久久久久久高潮一区二区 | 国产精品破处视频 | 亚洲最新视频在线播放 | 国产午夜精品一区二区三区在线观看 | 激情综合五月 | 中文乱码视频在线观看 | 欧美极品在线播放 | 国产精品久久久久久久久久直播 | 狠狠躁天天躁 | 色综合久久综合中文综合网 | 91精品久久久久久久久久久久久 | 欧美精品二区 | 日韩一区二区免费在线观看 | 中文字幕 国产精品 | 欧美日韩高清在线观看 | 又爽又黄又无遮挡网站动态图 | a成人在线 | 午夜精品一区二区三区免费视频 | 日韩视频在线不卡 | 国产一区国产二区在线观看 | 久草免费在线观看视频 | 91成人破解版| 97视频在线看 | 久久久精品影视 | 制服丝袜亚洲 | 久久久久免费精品 | 亚洲精品自在在线观看 | www黄免费 | 久久99精品视频 | 久青草影院 | 视频在线日韩 | 亚洲最新av在线网址 | 日韩成人免费在线电影 | 国产色爽 | 天天干天天做天天操 | 亚洲精品美女久久久久 | 亚洲国产欧美一区二区三区丁香婷 | 国产一级高清 | 亚洲激情av | 色停停五月天 | 国产99一区二区 | 麻豆免费视频网站 | 中文字幕免费高清av | 亚洲精品国产电影 | 免费碰碰 | 日韩www在线| 天天射天天干天天 | 欧美日韩视频精品 | 国产高清在线免费观看 | 91久久丝袜国产露脸动漫 | 免费进去里的视频 | 在线免费观看涩涩 | 日韩在线播放视频 | 精品高清美女精品国产区 | 成人黄色大片在线观看 | 欧美日韩高清一区二区三区 | 色婷婷狠狠五月综合天色拍 | 成人午夜电影在线播放 | www日日夜夜 | 国产精品高| 日本一区二区不卡高清 | 久久躁日日躁aaaaxxxx | 九色自拍视频 | 日韩在线观看你懂得 | 亚洲黄色免费观看 | 亚洲黄色一级视频 | 国产一区成人 | 日韩av一区二区三区 | 在线视频黄 | 国产美女主播精品一区二区三区 | av黄色在线| 91香蕉视频污在线 | 日韩中文字幕a | 亚洲视频大全 | www.伊人网 | 欧美日韩精品网站 | 久久免费视频8 | a在线观看国产 | 黄色av电影一级片 | 久久香蕉国产精品麻豆粉嫩av | 国产人成免费视频 | 久久久久久不卡 | 久久精品www人人爽人人 | www.xxx.性狂虐 | 免费视频一区二区 | 久久成人一区 | 久草在线资源网 | 国内精品久久久久影院优 | 黄色综合| 日本久久久精品视频 | 深爱激情综合网 | 国产黄色片一级三级 | 狠狠干网| 99久久999久久久精玫瑰 | 片网站 | 成人网色| 国产精品电影一区二区 | 亚洲精品国精品久久99热一 | 久久综合五月婷婷 | 久久99精品国产麻豆宅宅 | 日韩久久精品一区 | 久久精品三级 | 九九热国产视频 | 激情在线网站 | 亚洲欧美色婷婷 | 日日天天av | 久草在线视频免赞 | 午夜精品一二区 | 亚洲四虎 | 久久精品久久99 | 久久免费精彩视频 | 鲁一鲁影院| 成人免费网站视频 | 国产精品久久毛片 | av手机在线播放 | 日本高清xxxx | 91麻豆精品一区二区三区 | 国产精品婷婷 | 日韩城人在线 | 国产三级久久久 | 日韩一级电影在线观看 | 久久久久免费精品视频 | 久久免费精品国产 | 亚洲精品久久久久www | 亚洲激情校园春色 | 午夜视频黄 |