无码中文字幕色专区_91av俱乐部_无码人妻h动漫_26uuu成人_91九色丨porny丨国产jk_青青视频在线播放_国内自拍第二页_国产又粗又长又爽又黄的视频_色哟哟免费网站_久久出品必属精品_a级黄色一级片_99日在线视频

Windows 95下串行通信編程技術(shù)及其實(shí)現(xiàn)

郭峰林 朱才連

  摘 要 本文首先簡(jiǎn)單討論MSDOS、16位Windows和Windows95下的通信編程差別,然后著重講述32位Windows95 環(huán)境下的通信編程技術(shù),最后給出利用該技術(shù)實(shí)現(xiàn)串行通信的實(shí)例。
  關(guān)鍵詞 API函數(shù),串行通信,中斷,查詢,線程,同步,異步,阻塞

TECHNIQUE OF SERIAL COMMUNICATION PROGRAMMING
AND ITS REALIZATION IN WINDOWS95

Guo Fenglin Zhu Cailian
Institute of Geodesy & Geophysics, Chinese Academy of Sciences, Hubei.Wuhan 430077

  Abstract This paper discusses the difference of communication programming in the operating system of MSDOS,16 bit Windows and Windows95.Then tells of some problems about serial communication programming technique in 32 bit OS of windows95. Finally, an example of the application of this technique in windows95is provided.
  Keywords API function, Serial communication, Interrupt, Poll, Thread, Synchronization, Asynchronization

1 前言
  Windows95以其形象的圖形界面設(shè)計(jì)、操作簡(jiǎn)單、功能強(qiáng)大、可靠性高等優(yōu)點(diǎn),贏得了越來(lái)越多的用戶,開(kāi)發(fā)Windows95應(yīng)用程序已經(jīng)成為當(dāng)今的主流。在諸多的應(yīng)用開(kāi)發(fā)中,與外部硬件設(shè)備通信是常見(jiàn)的應(yīng)用,而串行通信以其簡(jiǎn)單的硬件連接方式常常成為應(yīng)用開(kāi)發(fā)者的首選。然而串行通信編程從MSDOS、Windows3.1到Windows95各不相同,雖然在功能上越來(lái)越強(qiáng),但是編程的復(fù)雜度也相應(yīng)增大。
  筆者最近在Windows95環(huán)境下開(kāi)發(fā)一套“公安110智能報(bào)警系統(tǒng)”,該系統(tǒng)需要對(duì)報(bào)警電話進(jìn)行實(shí)時(shí)監(jiān)控,以便能實(shí)時(shí)地進(jìn)行接警和處警。報(bào)警電話的監(jiān)控是通過(guò)檢測(cè)從電話交換機(jī)中饋送的RS232標(biāo)準(zhǔn)的串行通信信號(hào),其中串行口通信采用3線方式。該系統(tǒng)采用Windows95下的Visual C++ 5.0編寫,由于有關(guān)Windows95的串行口通信編程方面的資料少,串行通信編程的實(shí)例也不多見(jiàn),筆者在成功開(kāi)發(fā)“公安110智能報(bào)警系統(tǒng)”的基礎(chǔ)上,取得了一些經(jīng)驗(yàn),現(xiàn)在將有關(guān)串行口通信方面的一些關(guān)鍵技術(shù)寫出來(lái),供廣大的編程者借鑒、參考。

2 下串行通信編程特征
  MSDOS下的串行通信編程較簡(jiǎn)單,通信編程可以直接對(duì)串口的物理地址進(jìn)行編程操作同時(shí)配合BIOS調(diào)用,即可實(shí)現(xiàn)串行口數(shù)據(jù)讀寫。
  在Windows下,串行口作為系統(tǒng)資源,由設(shè)備驅(qū)動(dòng)程序統(tǒng)一管理,用戶不能象在MSDOS下一樣直接對(duì)串行口硬件端口進(jìn)行編程。16位的Windows3.1操作系統(tǒng)提供了專門的串行通信的API函數(shù):OpenComm()、CloseComm()、ReadComm()、 WriteComm()等,通過(guò)這些專用API(Application Programming Interfaces)函數(shù)來(lái)設(shè)置和讀、寫串行口。而Windows95將串行口和其它通信設(shè)備如Modern、傳真機(jī)等統(tǒng)一視作文件,對(duì)串行口的打開(kāi)、關(guān)閉、讀寫等操作與操作普通文件的API函數(shù)相同,如CreateFile()、CloseHandel()、ReadFile()、WriteFile(),正是由于這些函數(shù)的“多態(tài)性”, 同時(shí)還由于需要結(jié)合Windows95的線程編程、事件驅(qū)動(dòng)等新技術(shù),因而使得Windows95下的串行口通信編程比較復(fù)雜。

3 Windows95下串行通信API函數(shù)
  在Windows95中將串行口與文件的統(tǒng)一了起來(lái),對(duì)它們的打開(kāi)、讀、寫、關(guān)閉等操作都使用相同的API函數(shù),但是它們之間又有差別,譬如串行口不能象文件一樣可以被刪除,這些差別體現(xiàn)在API函數(shù)中部分參數(shù)的設(shè)置上。
  弄清串行通信API函數(shù)的用法是掌握串行通信編程技術(shù)的關(guān)鍵。下面介紹幾個(gè)與串行通信編程密切相關(guān)的API函數(shù),著重說(shuō)明這些API函數(shù)在進(jìn)行串行通信時(shí)參數(shù)設(shè)置需要注意的地方。其它沒(méi)有提及的函數(shù)及參數(shù)可以參考Windows95 API函數(shù)手冊(cè)。
3.1 打開(kāi)串行口API函數(shù)
  Windows95通信會(huì)話以調(diào)用CreateFile()函數(shù)打開(kāi)串行口開(kāi)始。調(diào)用CreateFile()打開(kāi)串口成功,返回一個(gè)操作句柄。該句柄供隨后對(duì)串行口的設(shè)置、讀寫等操作用。
  CreateFile()函數(shù)原型:
 HANDLE CreateFile(LPCTSTR szDevice, DWORD dwAccess,
DWORD dwShareMode, LPSECURITYATTRIBUTES lpSA,
DWORD dwCreate, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );
  調(diào)用此函數(shù)要注意這幾個(gè)參數(shù)的設(shè)置:dwShareMode指定該端口的共享屬性。該參數(shù)是為文件共享提供的,串行口不能作為共享設(shè)備。故參數(shù)值必須為0,這是文件與通信設(shè)備之間的主要差異之一;dwCreate必須為OPENEXISTING。因?yàn)镃reateFile()只能打開(kāi)存在的端口,而不能象創(chuàng)建新文件一樣創(chuàng)建物理上不存在的新串口;dwFlagsAndAttributes描述了該端口的各種屬性。對(duì)于文件來(lái)說(shuō),具有多種屬性(只讀、隱藏、系統(tǒng))是可能的,但是對(duì)于串行口,唯一有意義的設(shè)置是FILEFLAGOVERLAPPED;參數(shù)hTemplateFile必須為NULL。
  返回值:若成功,返回創(chuàng)建的句柄;否則返回,INVALIDHANDLEVALUE.
  舉例:打開(kāi)串行口1
 HANDLE hComm;                           //定義句柄變量
 hComm = CreateFile( "COM1",
 GENERICREAD|GENERICWRITE,NULL,NULL,
 OPENEXISTING,FILEFLAGOVERLAPPED,NULL);
 if (hComm == INVALIDHANDLEVALUE) {…….
 // 打開(kāi)串口錯(cuò)誤的處理}

3.2 配置串行口API函數(shù)
  串行口打開(kāi)成功,接下來(lái)可以配置串行口通信參數(shù)如波特率、數(shù)據(jù)位數(shù)、停止位、校驗(yàn)位等。修改這些參數(shù)時(shí)要和設(shè)備控制塊DCB(Device Control Block)打交道,DCB有近30個(gè)數(shù)據(jù)成員,是一個(gè)很復(fù)雜的數(shù)據(jù)結(jié)構(gòu),全部弄清楚它們的含義相當(dāng)費(fèi)時(shí)。而對(duì)于采用3線方式的串行通信來(lái)說(shuō),DCB結(jié)構(gòu)中絕大多數(shù)參數(shù)可以不予考慮,因?yàn)橹灰O(shè)置好波特率、數(shù)據(jù)位、停止位、校驗(yàn)位等幾個(gè)關(guān)鍵參數(shù)就行。這里介紹一種簡(jiǎn)捷的方法可以做到不了解DCB的詳細(xì)內(nèi)容也可以設(shè)置好串行通信參數(shù)。
  通過(guò)下面的程序來(lái)說(shuō)明串行通信參數(shù)的設(shè)置方法。例程中利用BuildCommDCB函數(shù)來(lái)設(shè)置DCB,然后用函數(shù)SetCommState()配置串行通信口。
DCB dcb ;                              //定義設(shè)備控制塊
GetCommState(hComm,&dcb);                 //取出系統(tǒng)缺省設(shè)備控制塊
BuildCommDCB("COM2:9600,N,8,1",&dcb);                //設(shè)置DCB主要參數(shù)
SetCommState(hComm,&dcb);
3.3 超時(shí)設(shè)置API函數(shù)
  編寫通信應(yīng)用程序的一個(gè)很關(guān)鍵的問(wèn)題就是如何處理通信中的不可預(yù)測(cè)的事件。譬如接收數(shù)據(jù)過(guò)程中突然被中斷,或者發(fā)送數(shù)據(jù)突然停止等等。如果不認(rèn)真對(duì)待,這些情況可能會(huì)引起I/O線程掛起或者線程被無(wú)限阻塞。Windows95對(duì)于這類問(wèn)題提供了安全措施,它讓你通過(guò)超時(shí)設(shè)置來(lái)決定通信是否異常并作相應(yīng)處理。因此超時(shí)設(shè)置在串行通信中顯得尤為重要。
  超時(shí)設(shè)置過(guò)程分為兩步,首先設(shè)置COMMTIMEOUTS結(jié)構(gòu)中的五個(gè)變量,然后調(diào)用SetCommTimeouts()函數(shù)設(shè)置超時(shí)值。COMMTIMEOUTS結(jié)構(gòu)的定義如下:
 typedef struct  COMMTIMEOUTS {
DWORD ReadIntervalTimeout;                      //讀端口間隔超時(shí)
DWORD ReadTotalTimeoutMultiplier;                //讀端口總超時(shí)乘數(shù)
DWORD ReadTotalTimeoutConstant;                //讀端口總超時(shí)常數(shù)(ms)
DWORD WriteTotalTimeoutMultiplier;                //寫端口總超時(shí)乘數(shù)
DWORD WriteTotalTimeoutConstant;               //寫端口總超時(shí)常數(shù)(ms)
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
3.4 讀串口API函數(shù)
  串行口打開(kāi)后,可以對(duì)它進(jìn)行讀寫操作。讀串行口的函數(shù)原型:
 BOOL ReadFile (HANDLE hFile, LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped data);
  其中,第一個(gè)參數(shù)hFile是由CreateFile()返回的句柄。參數(shù)lpBuffer是讀取的數(shù)據(jù)緩沖區(qū)指針,要注意給該數(shù)據(jù)緩沖區(qū)分配足夠的空間;參數(shù)nNumberOfBytesToRead是要讀取的字節(jié)數(shù);參數(shù)lpNumberOfBytesRead是實(shí)際讀取的字節(jié)數(shù);最后一個(gè)參數(shù)lpOverlapped 是指向一個(gè)可重疊I/O(異步)的數(shù)據(jù)結(jié)構(gòu)指針。如果lpOverlapped設(shè)置為NULL,則ReadFile()工作在同步方式;如果lpOverlapped指向一個(gè)重疊結(jié)構(gòu),則工作在異步方式。
3.5 寫串口API函數(shù)
 BOOL WriteFile (HANDLE hFile,             // 由CreateFile()返回的句柄
              LPCVOID lpBuffer,            // 寫緩沖區(qū)指針
           DWORD nNumberOfBytesToWrite,         // 要寫的字節(jié)數(shù)
           LPDWORD lpNumberOfBytesWritten,       // 實(shí)際寫的字節(jié)數(shù)
           LPOVERLAPPED lpOverlapped  // 指向一個(gè)可重疊I/O的數(shù)據(jù)結(jié)構(gòu));
            WriteFile()函數(shù)的工作方式選擇與ReadFile()的相同,在此不重復(fù)。
3.6 關(guān)閉串口API函數(shù)
  串行口是非共享資源,某應(yīng)用程序打開(kāi)串行口后,即獨(dú)占該資源,使其它應(yīng)用程序無(wú)法再訪問(wèn),直到該應(yīng)用程序釋放串口。所以打開(kāi)串口后,一定要關(guān)閉串口。關(guān)閉串口函數(shù)較簡(jiǎn)單。函數(shù)原型:BOOL CloseHandle( HANDLE hObject );其中hObject參數(shù)為CreateFile()返回的端口句柄。返回值非0,則調(diào)用成功。

4 Windows95的串行通信工作方式
  串行通信會(huì)話以調(diào)用CreateFile()函數(shù)打開(kāi)串行口開(kāi)始,接著設(shè)置串行口波特率、數(shù)據(jù)位、校驗(yàn)位、停止位等參數(shù)以及超時(shí)參數(shù),最后選擇一種工作方式讀、寫串行口。在Windows95中,串行通信有兩種工作方式可供選擇:查詢方式和事件驅(qū)動(dòng)方式。這兩種工作方式各有優(yōu)缺點(diǎn),用戶可以根據(jù)應(yīng)用程序的實(shí)際需要選擇其中的一種工作方式,下面對(duì)這兩種工作方式分別介紹。
4.1 查詢方式
  對(duì)于從串口讀取數(shù)據(jù)來(lái)說(shuō),查詢是最為直接、易于理解的技術(shù)。但是查詢會(huì)占用大量的CPU時(shí)間,效率較低。利用查詢方式讀取串口數(shù)據(jù)時(shí)通常要建立一個(gè)線程,建立線程使用CreateThread()函數(shù)。循環(huán)查詢?cè)诰程里進(jìn)行。舉例:(假設(shè)端口已經(jīng)打開(kāi))
 DWORD ReadThread(LPDWORD lpdwParam)
{ BYTE Buff[100];                          //讀數(shù)據(jù)緩沖區(qū)
DWORD nBytesRead;                         //實(shí)際讀取的字節(jié)數(shù)
COMMTIMEOUTS Timeouts;                          //超時(shí)設(shè)置
Memset(&Timeouts,0,sizeof(COMMTIMEOUTS));
Timeouts.ReadIntervalTimeout = MAXDWORD;
SetCommTimeouts(hComm,&Timeouts);
While(bReading){
if(!ReadFile(hComm,Buff,100,&nBytesRead,NULL))
{………                             //讀取數(shù)據(jù)出錯(cuò)處理}
else{………                          //正確讀取數(shù)據(jù)的處理}
}
PurgeComm(hComm,PURGERXCLEAR);
return 0;
}
  例程中,線程的退出由bReading標(biāo)志控制,當(dāng)bReading為TRUE時(shí),循環(huán)串口;當(dāng)breading為FALSE時(shí),線程退出。
4.2 事件驅(qū)動(dòng)方式
  事件驅(qū)動(dòng)I/O方式是指線程通過(guò)監(jiān)視通信資源中的一組事件來(lái)進(jìn)行I/O操作,這種方式類似于MSDOS下的中斷工作方式,效率高。可被監(jiān)視的事件列表如下:

事件掩碼 含義
EVBREAK 檢測(cè)到輸入終止
EVCTS CTS(清除發(fā)送)信號(hào)改變狀態(tài)
EVDSR DSR(數(shù)據(jù)設(shè)置就緒)信號(hào)改變狀態(tài)
EVERR 發(fā)生了線路狀態(tài)錯(cuò)誤
EVRING 檢測(cè)到振鈴
EVRLSD RLSD信號(hào)改變狀態(tài)
EVRXCHAR 收到任何字符并放進(jìn)輸入緩沖區(qū)
EVRXFLAG 收到事件字符,并放進(jìn)輸入緩沖區(qū)
EVTXEMPTY 輸出緩沖區(qū)中最后一個(gè)字符發(fā)送出去
  實(shí)際編程中,對(duì)串行口的讀、寫操作需要建立兩個(gè)工作者線程。在讀或?qū)懢程中可以通過(guò)SetCommMask()函數(shù)設(shè)置事件屏蔽來(lái)監(jiān)視指定通信資源上的事件。指定一組事件后,線程可以使用WaitCommEvent()函數(shù)等待其中一個(gè)事件發(fā)生,在等待過(guò)程中它將花費(fèi)極少的CPU時(shí)間。注意:WaitCommEvent()函數(shù)和讀寫操作函數(shù)一樣可以同步使用,也可以異步使用,這主要取決于在第三個(gè)參數(shù)中是否指定OVERLAPPED結(jié)構(gòu)。如果指定為NULL,該函數(shù)就是同步的,必須等到SetCommMask()中指定的事件有一個(gè)發(fā)生時(shí)它才返回;如果指定了一個(gè)OVERLAPPED結(jié)構(gòu),該函數(shù)即工作在異步方式。通常將該函數(shù)工作在同步方式。
  下面的例程演示了利用事件驅(qū)動(dòng)I/O方式從串行口讀取數(shù)據(jù)。
DWORD ReadThread(LPDWORD lpdwParam)
{ BYTE Buff[100];                          //讀數(shù)據(jù)緩沖區(qū)
DWORD nBytesRead, dwEvent, dwError;
COMMTIMEOUTS Timeouts;                          //超時(shí)設(shè)置
Memset(&Timeouts,0,sizeof(COMMTIMEOUTS));
Timeouts.ReadTotalTimeoutMultiplier=5;
Timeouts.ReadTotalTimeoutConstant=100;
SetCommTimeouts(hComm,&Timeouts);
SetCommMask(hComm,EVRXCHAR);    //設(shè)置EVRXCHAR掩碼,當(dāng)任何字符到達(dá)時(shí)產(chǎn)生事件
While(bReading){
if(WaitCommEvent(hComm,&dwEvent,NULL))
{                              //接收緩沖區(qū)有字符到達(dá)
if(dwEvent & EVRXCHAR)
{                               //確認(rèn)是EVRXCHAR事件
if(!ReadFile(hComm,Buff,1,&nBytesRead,NULL))
{……                                 //處理讀錯(cuò)誤}
else{……                            //正確接收字符處理}
}else{……                         //非EVRXCHAR事件的處理}
}}
PurgeComm(hComm,PURGERXCLEAR);
return 0;}
  在上面的例程中,設(shè)置EVRXCHAR事件掩碼,則告訴Windows無(wú)論何時(shí)接收到一個(gè)字節(jié),就產(chǎn)生一個(gè)事件。在WaitCommEvent()返回后,比較該函數(shù)返回的事件掩碼,如果是EVRXCHAR,則說(shuō)明接收緩沖區(qū)中至少有一個(gè)字符處于等待狀態(tài);否則,就是錯(cuò)誤事件,需要進(jìn)行錯(cuò)誤處理。

5 效果
  作者在開(kāi)發(fā)的“公安110智能報(bào)警系統(tǒng)”時(shí)利用事件驅(qū)動(dòng)方式的串行通信編程技術(shù)處理多種系統(tǒng)設(shè)備間頻繁的數(shù)據(jù)交換任務(wù),應(yīng)用非常成功。系統(tǒng)可實(shí)時(shí)地監(jiān)控從市話網(wǎng)上不斷傳來(lái)的報(bào)警電話。

作者簡(jiǎn)介:郭峰林 碩士研究生。
朱才連 博士生導(dǎo)師,研究員。

作者單位:中國(guó)科學(xué)院測(cè)量與地球物理研究所 湖北.武昌(430077)

參考文獻(xiàn)
[1] Microsoft Corporation,著.Win32程序員參考大全(二). 欣 力,等譯.北京:清華大學(xué)出版社,1995,4
[2] Microsoft Corporation. Microsoft Developer Network
[3] Peter W.Gofton,著.精通串行通信.王仲文,等譯.北京:電子工業(yè)出版社,1995,2
[4] Charles A.Mirho, Andre Terrisse,著. Windows95通信編程.賀 軍,等譯.北京:清華大學(xué)出版社,1997,12
[5] Scott Stanfield, RalphArvesen,著. Visual C++4開(kāi)發(fā)人員指南.北京:機(jī)械工業(yè)出版社1997,6

 

无码中文字幕色专区_91av俱乐部_无码人妻h动漫_26uuu成人_91九色丨porny丨国产jk_青青视频在线播放_国内自拍第二页_国产又粗又长又爽又黄的视频_色哟哟免费网站_久久出品必属精品_a级黄色一级片_99日在线视频
国产精品黄网站| 蜜桃视频一区二区三区| 国产精品欧美在线观看| 午夜日韩福利| 精品久久精品| 欧美综合精品| 中文字幕av亚洲精品一部二部| 91综合网人人| 美女在线视频一区| 久久精品99国产精品| 在线亚洲激情| 久久香蕉国产| 欧美成a人国产精品高清乱码在线观看片在线观看久| 一区在线观看| 香蕉久久精品| 久久国产亚洲| 欧美a级一区| 欧美va天堂| 女同性一区二区三区人了人一| 欧美一区久久久| 日韩久久电影| av在线最新| 伊人久久在线| 日韩欧美精品综合| 日韩欧美三级| 色老板在线视频一区二区| 国产传媒在线观看| 欧美日韩免费观看视频| 99久久夜色精品国产亚洲1000部| 日韩伦理一区| 久久久久午夜电影| 午夜免费一区| 亚洲va久久久噜噜噜久久| 日韩国产欧美三级| 麻豆久久久久久| 亚洲涩涩在线| 好吊一区二区三区| 亚洲欧洲免费| 国产精品17p| 欧美日韩免费观看视频| 日韩精品午夜| 日韩中文字幕1| 婷婷精品在线观看| 国产精品亚洲综合在线观看| 久久久国产精品入口麻豆| 高清一区二区三区av| 久久久影院免费| 亚洲va久久久噜噜噜久久| 久久成人av| 999久久久亚洲| 无码日韩精品一区二区免费| 国产精品极品国产中出| 99久久精品费精品国产| 日本亚洲欧美天堂免费| 国产精品第一国产精品| 日本久久精品| 免费在线观看精品| 国内精品伊人| 蜜臀久久久99精品久久久久久| 国产精品入口久久| 日韩精品一卡| 亚洲另类黄色| 91精品国产福利在线观看麻豆| 一区二区三区国产盗摄| 日韩大片免费观看| 天堂久久av| 欧美一区二区三区高清视频| 午夜亚洲福利| 在线午夜精品| 日韩一区欧美| 欧美日韩1区2区3区| 久久久成人网| 国产精品1区| 日韩在线a电影| 97人人精品| 国产精品蜜月aⅴ在线| 性欧美长视频| 久久国产亚洲| a天堂资源在线| 国产欧美成人| 日本成人在线一区| av不卡在线看| 亚洲午夜久久久久久尤物| 久久不卡日韩美女| 日韩av一级片| 影音先锋久久精品| 婷婷综合激情| 亚洲小说欧美另类婷婷| 亚洲精品在线影院| 中文av在线全新| 久久麻豆视频| 欧美日韩一区二区三区四区在线观看 | 久久久成人网| 国产精品美女午夜爽爽| 天堂va在线高清一区| av亚洲免费| 久久久成人网| 99视频精品视频高清免费| 日韩在线观看一区| 久久久精品久久久久久96| 97国产精品| av最新在线| 国产麻豆久久| 久久香蕉国产| 国产精品毛片一区二区三区| 欧美午夜精品一区二区三区电影| 欧美国产偷国产精品三区| 免费亚洲婷婷| 国产videos久久| 激情国产在线| 不卡中文字幕| 免费人成网站在线观看欧美高清| 首页国产欧美日韩丝袜| 日韩专区视频网站| 久久精品国产成人一区二区三区| 精品福利久久久| 亚洲成av在线| 国产午夜久久| 国产精品99久久免费观看| 久久久久久自在自线| 午夜av一区| 中文字幕日韩亚洲| 国产欧美三级| 成人精品中文字幕| 亚洲三级av| 成人亚洲一区| 亚洲免费播放| 麻豆精品久久久| 国产一在线精品一区在线观看| 视频一区在线视频| 精品网站999| 亚洲一区黄色| 理论片午夜视频在线观看| 99日韩精品| 麻豆久久久久久| 日韩精品一级中文字幕精品视频免费观看 | 伊人久久亚洲美女图片| 日本少妇精品亚洲第一区| 免费看一区二区三区| 亚洲精品电影| 国产情侣久久| 99国产精品久久久久久久| 国产精品欧美在线观看| 国产精品97| 久久久久黄色| 亚州欧美在线| 91久久久精品国产| 成人午夜在线| 日韩精品一卡二卡三卡四卡无卡| 日韩综合在线| 欧美精品国产| 亚洲无线观看| 好吊视频一区二区三区四区| 国产成人精品亚洲线观看| 蜜臀久久久久久久| 成人精品天堂一区二区三区| 国产精品入口久久| 视频一区国产视频| 国产综合激情| 日韩av首页| 激情国产在线| 国产一区日韩| 欧美一级一区| 免费观看在线综合| 中文一区二区| 午夜国产精品视频| 亚洲成人va| 人在线成免费视频| 国产成人精品福利| 免费精品一区| 国产精品欧美在线观看| 91精品尤物| 日本久久一区| 日韩精品第二页| 日本在线视频一区二区| 蜜臀久久久99精品久久久久久| 最新亚洲激情| 久久亚洲欧美| 亚洲精品女人| 深夜福利亚洲| 日韩区一区二| 国产精品一区二区三区www| 亚欧洲精品视频在线观看| 亚洲欧美日韩视频二区| 国产综合激情| 99pao成人国产永久免费视频 | 男女男精品视频网| 久久成人亚洲| 日韩精品一级中文字幕精品视频免费观看 | 精品久久影院| 精品久久电影| 国产精品久久久久久久久妇女| 久久久久久夜| 久久精品国语| 国产模特精品视频久久久久| 亚洲午夜免费| 国产精品久久久久久久久久久久久久久 | 免费看久久久| 日韩国产一区二区三区| 欧美日韩水蜜桃|