亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chuanhangtongxun.txt

?? 三種常用的串行通訊的編程方法
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
笑千秋 @ 2004-10-24 14:58

用VC 6.0實現串行通信的三種方法 
 摘要: 本文介紹了在Windows平臺下串行通信的實現機制,討論了根據不同的條件用Visual C++ 設計串行通信程序的三種方法,并結合實際,實現對溫度數據的接收監控。 

  在實驗室和工業應用中,串口是常用的計算機與外部串行設備之間的數據傳輸通道,由于串行通信方便易行,所以應用廣泛。依據不同的條件實現對串口的靈活編程控制是我們所需要的。 

  在光學鏡片鍍膜工藝中,用單片機進行多路溫度數據采集控制,采集結果以串行方式進入主機,每隔10S向主機發送一次采樣數據,主機向單片機發送相關的控制命令,實現串行數據接收,處理,記錄,顯示,實時繪制曲線。串行通信程序開發環境為 VC++ 6.0。 

  Windows下串行通信 

  與以往DOS下串行通信程序不同的是,Windows不提倡應用程序直接控制硬件,而是通過Windows操作系統提供的設備驅動程序來進行數據傳遞。串行口在Win 32中是作為文件來進行處理的,而不是直接對端口進行操作,對于串行通信,Win 32 提供了相應的文件I/O函數與通信函數,通過了解這些函數的使用,可以編制出符合不同需要的通信程序。與通信設備相關的結構有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7個,與通信有關的Windows API函數共有26個,詳細說明可參考MSDN幫助文件。以下將結合實例,給出實現串行通信的三種方法。 

  實現串行通信的三種方法 

  方法一:使用VC++提供的串行通信控件MSComm 首先,在對話框中創建通信控件,若Control工具欄中缺少該控件,可通過菜單Project --> Add to Project --> Components and Control插入即可,再將該控件從工具箱中拉到對話框中。此時,你只需要關心控件提供的對 Windows 通訊驅動程序的 API 函數的接口。換句話說,只需要設置和監視MSComm控件的屬性和事件。 

  在ClassWizard中為新創建的通信控件定義成員對象(CMSComm m_Serial),通過該對象便可以對串口屬性進行設置,MSComm 控件共有27個屬性,這里只介紹其中幾個常用屬性: 

  CommPort 設置并返回通訊端口號,缺省為COM1。 

  Settings 以字符串的形式設置并返回波特率、奇偶校驗、數據位、停止位。 

  PortOpen 設置并返回通訊端口的狀態,也可以打開和關閉端口。 

  Input 從接收緩沖區返回和刪除字符。 

  Output 向發送緩沖區寫一個字符串。 

  InputLen 設置每次Input讀入的字符個數,缺省值為0,表明讀取接收緩沖 區中的全部內容。 

  InBufferCount 返回接收緩沖區中已接收到的字符數,將其置0可以清除接收緩 沖區。 

  InputMode 定義Input屬性獲取數據的方式(為0:文本方式;為1:二進制方式)。 

  RThreshold 和 SThreshold 屬性,表示在 OnComm 事件發生之前,接收緩沖區或發送緩沖區中可以接收的字符數。 

  以下是通過設置控件屬性對串口進行初始化的實例: 

BOOL CSampleDlg:: PortOpen() 
{ 
BOOL m_Opened; 
...... 
m_Serial.SetCommPort(2); // 指定串口號 
m_Serial.SetSettings("4800,N,8,1"); // 通信參數設置 
m_Serial.SetInBufferSize(1024); // 指定接收緩沖區大小 
m_Serial.SetInBufferCount(0); // 清空接收緩沖區 
m_Serial.InputMode(1); // 設置數據獲取方式 
m_Serial.SetInputLen(0); // 設置讀取方式 
m_Opened=m_Serail.SetPortOpen(1); // 打開指定的串口 
return m_Opened; 
} 

  打開所需串口后,需要考慮串口通信的時機。在接收或發送數據過程中,可能需要監視并響應一些事件和錯誤,所以事件驅動是處理串行端口交互作用的一種非常有效的方法。使用 OnComm 事件和 CommEvent 屬性捕捉并檢查通訊事件和錯誤的值。發生通訊事件或錯誤時,將觸發 OnComm 事件,CommEvent 屬性的值將被改變,應用程序檢查 CommEvent 屬性值并作出相應的反應。在程序中用ClassWizard為CMSComm控件添加OnComm消息處理函數: 

void CSampleDlg::OnComm() 
{ 
...... 
switch(m_Serial.GetCommEvent()) 
{ 
case 2: 
// 串行口數據接收,處理; 
} 
}   
方法二:在單線程中實現自定義的串口通信類 

  控件簡單易用,但由于必須拿到對話框中使用,在一些需要在線程中實現通信的應用場合,控件的使用顯得捉襟見肘。此時,若能夠按不同需要定制靈活的串口通信類將彌補控件的不足,以下將介紹如何在單線程中建立自定義的通信類。 

  該通信類CSimpleComm需手動加入頭文件與源文件,其基類為CObject,大致建立步驟如下: 

  (1) 打開串口,獲取串口資源句柄 

  通信程序從CreateFile處指定串口設備及相關的操作屬性。再返回一個句柄,該句柄將被用于后續的通信操作,并貫穿整個通信過程。CreateFile()函數中有幾個值得注意的參數設置:串口共享方式應設為0,串口為不可共享設備;創建方式必須為OPEN_EXISTING,即打開已有的串口。對于dwFlagAndAttribute參數,對串口有意義的值是FILE_FLAG_OVERLAPPED,該標志表明串口采用異步通信模式,可進行重疊操作;若值為NULL,則為同步通信方式,在同步方式下,應用程序將始終控制程序流,直到程序結束,若遭遇通信故障等因素,將導致應用程序的永久等待,所以一般多采用異步通信。 

  (2)串口設置 

  串口打開后,其屬性被設置為默認值,根據具體需要,通過調用GetCommState(hComm,&dcb)讀取當前串口設備控制塊DCB(Device Control Block)設置,修改后通過SetCommState(hComm,&dcb)將其寫入。再需注意異步讀寫的超時控制設置, 通過COMMTIMEOUTS結構設置超時,調用SetCommTimeouts(hComm,&timeouts)將結果寫入。以下是溫度監控程序中串口初始化成員函數: 

BOOL CSimpleComm::Open( ) 
{ 
DCB dcb; 

m_hIDComDev=CreateFile( "COM2", 
GENERIC_READ | GENERIC_WRITE, 
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ 
NORMAL|FILE_FLAG_OVE RLAPPED, NULL ); 
// 打開串口,異步操作 
if( m_hIDComDev == NULL ) return( FALSE ); 

dcb.DCBlength = sizeof( DCB ); 
GetCommState( m_hIDComDev, &dcb ); // 獲得端口默認設置 
dcb.BaudRate=CBR_4800; 
dcb.ByteSize=8; 
dcb.Parity= NOPARITY; 
dcb.StopBits=(BYTE) ONESTOPBIT; 
...... } 

  (3)串口讀寫操作 

  主要運用ReadFile()與WriteFile()API函數,若為異步通信方式,兩函數中最后一個參數為指向OVERLAPPED結構的非空指針,在讀寫函數返回值為FALSE的情況下,調用GetLastError()函數,返回值為ERROR_IO_PENDING,表明I/O操作懸掛,即操作轉入后臺繼續執行。此時,可以用WaitForSingleObject()來等待結束信號并設置最長等待時間,舉例如下: 

BOOL bReadStatus; 
bReadStatus = ReadFile( m_hIDComDev, buffer, 
dwBytesRead, &dwBytesRead, &m_OverlappedRead ); 
if(!bReadStatus) 
{ 
if(GetLastError()==ERROR_IO_PENDING) 
{ 
WaitForSingleObject(m_OverlappedRead.hEvent,1000); 
return ((int)dwBytesRead); 
} 
return(0); 
} 
return ((int)dwBytesRead);   

  定義全局變量m_Serial作為新建通信類CSimpleComm的對象,通過調用類的成員函數即可實現所需串行通信功能。與方法一相比,方法二賦予串行通信程序設計較大的靈活性,端口的讀寫可選擇較簡單的查詢式,或通過設置與外設數據發送時間間隔TimeCycle相同的定時器:SetTimer(1,TimeCycle,NULL),進行定時讀取或發送。 

CSampleView:: OnTimer(UINT nIDEvent) 
{ 
char InputData[30]; 
m_Serial.ReadData(InputData,30); 
// 數據處理 
}   

  若對端口數據的響應時間要求較嚴格,可采用事件驅動I/O讀寫,Windows定義了9種串口通信事件,較常用的有: 

  EV_RXCHAR: 接收到一個字節,并放入輸入緩沖區。 

  EV_TXEMPTY: 輸出緩沖區中的最后一個字符發送出去。 

  EV_RXFLAG: 接收到事件字符(DCB結構中EvtChar成員),放入輸入緩沖區。 

  在用SetCommMask()指定了有用的事件后,應用程序可調用WaitCommEvent()來等待事件的發生。 
SetCommMask(hComm,0)可使WaitCommEvent()中止。 
方法三 多線程下實現串行通信 

  方法一,二適用于單線程通信。在很多工業控制系統中,常通過擴展串口連接多個外設,各外設發送數據的重復頻率不同,要求后臺實時無差錯捕捉,采集,處理,記錄各端口數據,這就需要在自定義的串行通信類中創建端口監視線程,以便在指定的事件發生時向相關的窗口發送通知消息。 

  線程的基本概念可詳見VC++參考書目,Windows內部的搶先調度程序在活動的線程之間分配CPU時間,Win 32 區分兩種不同類型的線程,一種是用戶界面線程UI(User Interface Thread),它包含消息循環或消息泵,用于處理接收到的消息;另一種是工作線程(Work Thread),它沒有消息循環,用于執行后臺任務。用于監視串口事件的線程即為工作線程。 

  多線程通信類的編寫在端口的配置,連接部分與單線程通信類相同,在端口配置完畢后,最重要的是根據實際情況,建立多線程之間的同步對象,如信號燈,臨界區,事件等,相關細節可參考VC++ 中的同步類。 

  一切就緒后即可啟動工作線程: 

CWinThrea *CommThread = AfxBegin 
Thread(CommWatchThread, // 線程函數名 
(LPVOID) m_pTTYInfo, // 傳遞的參數 
THREAD_PRIORITY_ABOVE_NORMAL, // 設置線程優先級 
(UINT) 0, // 最大堆棧大小 
(DWORD) CREATE_SUSPENDED , // 創建標志 
(LPSECURITY_ATTRIBUTES) NULL); // 安全性標志 

  同時,在串口事件監視線程中: 

if(WaitCommEvent(pTTYInfo->idComDev,&dwEvtMask,NULL)) 
{ 
if((dwEvtMask & pTTYInfo->dwEvtMask )== pTTYInfo->dwEvtMask) 
{ 
WaitForSingleObject(pTTYInfo->hPostEvent,0xFFFFFFFF); 
ResetEvent(pTTYInfo->hPostEvent); // 置同步事件對象為非信號態 
::PostMessage(CSampleView,ID_COM1_DATA,0,0); // 發送通知消息 
} 
} 

  用PostMessage()向指定窗口的消息隊列發送通知消息,相應地,需要在該窗口建立消息與成員函數間的映射,用ON_MESSAGE將消息與成員函數名關聯。 

BEGIN_MESSAGE_MAP(CSampleView, CView) 
//{{AFX_MSG_MAP(CSampleView) 
ON_MESSAGE(ID_COM1_DATA, OnProcessCom1Data) 
ON_MESSAGE(ID_COM2_DATA, OnProcessCom2Data) 
..... 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

  然后在各成員函數中完成對各串口數據的接收處理,但必須保證在下一次監測到有數據到來之前,能夠完成所有的中間處理工作。否則將造成數據的捕捉錯誤。 

  多線程的實現可以使得各端口獨立,準確地實現串行通信,使串口通信具有更廣泛的靈活性與嚴格性,且充分利用了CPU時間。但在具體的實時監控系統中如何協調多個線程,線程之間以何種方式實現同步也是在多線程串行通信程序實現的難點。 

  以VC++ 6.0 為工具,實現串行通信的三種方法各有利弊, 

  根據不同需要,選擇合適的方法,將達到事半功倍的效果。在溫度監控系統中,筆者采用了方法二,在Window 98 ,Windows 95 上運行穩定,取得了良好的效果。 

怎樣編寫一個在USB接口讀寫數據的程序?
笑千秋 @ 2004-10-20 20:06

主  題:  怎樣編寫一個在USB接口讀寫數據的程序?   
作  者:  topcool99 (笑千秋)   
等  級:     
信 譽 值:  100   
所屬社區:  VC/MFC 硬件/系統   
問題點數:  20   
回復次數:  6   
發表時間:  2004-10-17 15:38:17   
   
66666666666666666666666666666666
   

我準備做一個主機與設備的數據傳輸程序。 
現在分步實現: 
先寫一個PC端的界面程序。 
想用VC做。 
怎樣編寫一個在USB接口讀寫數據的程序? 
還有就是 
編好以后怎樣調試,怎樣查看接口的數據? 
有沒有專門的工具。超級終端可以實現嗎? 


  
 回復人: zblaoshu1979(周博) ( ) 信譽:101  2004-10-18 9:41:13  得分: 0   


   
看看DDK,createfile DeviceIoControl等函數 

  

Top   

回復人: zhangnanonnet(魚歡) ( ) 信譽:167  2004-10-18 10:05:17  得分: 0   


   
使用一個GUIDguidHID_1查找并打開一個USB設備 
extern "C" int PASCAL SearchUSBDevice() 
{ 
HANDLE hUsb; 

int nCount, i, j;//標記同一設備個數 
HDEVINFO hDevInfoSet; 
BOOL bResult; 

   PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL; 
  
memset(m_sysversion, 0, 20); 
GetSysVersion(m_sysversion); 

// 檢索相關GUID的USB設備總設備個數 
if (!GetUSBList()) 
{ 
return 0; 
} 
   // 取得一個該GUID相關的設備信息集句柄 
   hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE,     // class GUID 
       NULL,                    // 無關鍵字 
       NULL,                    // 不指定父窗口句柄 
       DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的設備 
        
   // 失敗... 
   if (hDevInfoSet == INVALID_HANDLE_VALUE) 
   { 
       return NULL; 
   } 
  
   // 申請設備接口數據空間 
     
   nCount = 0; 
   bResult = TRUE; 
for (i=0; i< 34; i++) 
{ 
bDeviceOpen = FALSE; 
memset(m_DeviceDesc, 0, 256); 
} 
  
SP_DEVICE_INTERFACE_DATA ifdata; 
   // 設備序號=0,1,2... 逐一測試設備接口,到失敗為止 
   while (bResult) 
   { 

       ifdata.cbSize = sizeof(ifdata); 
       // 枚舉符合該GUID的設備接口 
       bResult = ::SetupDiEnumDeviceInterfaces( 
           hDevInfoSet,     // 設備信息集句柄 
           NULL,            // 不需額外的設備描述 
           (LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE,          // GUID 
           (ULONG)nCount,   // 設備信息集里的設備序號 
           &ifdata);        // 設備接口信息 
  
       if (bResult) 
       { 
ULONG                                predictedLength = 0; 
ULONG                                requiredLength = 0; 
// 取得該設備接口的細節(設備路徑) 
           bResult = SetupDiGetInterfaceDeviceDetail( 
               hDevInfoSet,    // 設備信息集句柄 
               &ifdata,        // 設備接口信息 
               NULL,        // 設備接口細節(設備路徑) 
               0,    // 輸出緩沖區大小 
               &requiredLength,           // 不需計算輸出緩沖區大小(直接用設定值) 
               NULL);          // 不需額外的設備描述 
           // 取得該設備接口的細節(設備路徑) 
predictedLength=requiredLength; 

// if(pDetail) 
// { 
// pDetail =NULL; 
// } 
           pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength); 
           pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 
bResult = SetupDiGetInterfaceDeviceDetail( 
               hDevInfoSet,    // 設備信息集句柄 
               &ifdata,        // 設備接口信息 
               pDetail,        // 設備接口細節(設備路徑) 
               predictedLength,    // 輸出緩沖區大小 
               &requiredLength,           // 不需計算輸出緩沖區大小(直接用設定值) 
               NULL);          // 不需額外的設備描述 
  
           if (bResult) 
           { 
               // 復制設備路徑到輸出緩沖區 
               //::strcpy(pszDevicePath[nCount], pDetail->DevicePath); 
if (strcmp(m_sysversion, "winnt")==0) 
{ 
char ch[18]; 
for(i=0;i<17;i++){ 
ch=*(pDetail->DevicePath+8+i); 
} 
ch[17]='{row.content}'; 
if (strcmp(ch,"vid_0471&pid_0666")==0)//比較版本號,防止意外出錯 
{ 

memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;     
memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ;     

READ_OS.hEvent = CreateEvent( NULL,    // no security 
 TRUE,    // explicit reset req 
FALSE,   // initial event reset 
 NULL ) ; // no name 
if (READ_OS.hEvent == NULL)    
{ 
break; 
} 
       
WRITE_OS.hEvent = CreateEvent( NULL,    // no security 
 TRUE,    // explicit reset req 
FALSE,   // initial event reset 
 NULL ) ; // no name 
   if (NULL == WRITE_OS.hEvent) 
{ 
  CloseHandle( READ_OS.hEvent ); 
  break; 
} 

hUsb=CreateFile(pDetail->DevicePath,//&guidHID_1,// 
GENERIC_READ|GENERIC_WRITE, 
           FILE_SHARE_READ|FILE_SHARE_WRITE, 
NULL, 
OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL/*| 
FILE_FLAG_OVERLAPPED*/, 
NULL); 
if (hUsb != NULL) 
{ 
// 比較定位找到的USB在哪個USB PORT上 
char id[30]; 
memset(id, 0, 30); 
i=0; 
do 
{ 
id=*(pDetail->DevicePath+26+i); 
i++; 
} 
while(id[i-1]!='#'); 
id[i-1] = '{row.content}'; 
for (j=0; j<34; j++) 
{ 
if(strcmp(id, m_USBList[j])==0) 
{ 
sprintf(m_DeviceDesc[j+1], "%s", pDetail->DevicePath); 
m_USBPositionMap[nCount] = j+1; 
break; 
} 
} 

CloseHandle(hUsb); 
nCount++; 
// break; 
} 
}// 比較驅動版本 
}// 比較操作系統版本 
else 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av不卡一区二区三区| 国产日韩欧美电影| 丰满少妇久久久久久久 | 亚洲三级理论片| 欧美性生活久久| 粉嫩高潮美女一区二区三区 | 亚洲国产高清在线观看视频| 欧美日韩色综合| av一本久道久久综合久久鬼色| 久久精品国产亚洲一区二区三区| 伊人色综合久久天天人手人婷| 久久精品免费在线观看| 欧美一级理论性理论a| 在线观看视频一区二区欧美日韩| 不卡在线观看av| 国产传媒日韩欧美成人| 激情综合色播激情啊| 视频一区免费在线观看| 亚洲欧美经典视频| 成人欧美一区二区三区视频网页 | 日韩中文字幕区一区有砖一区| 国产精品视频麻豆| 久久美女高清视频| 精品成人一区二区三区四区| 欧美电影精品一区二区| 欧美大片顶级少妇| 精品sm在线观看| 久久久一区二区三区捆绑**| 精品成a人在线观看| 久久综合久久鬼色中文字| 制服丝袜亚洲色图| 日韩欧美一区二区免费| 日韩精品一区二区三区视频| 精品久久久久一区| 国产区在线观看成人精品| 色噜噜夜夜夜综合网| 视频一区视频二区中文字幕| 一区二区三区中文字幕在线观看| 《视频一区视频二区| 国产欧美精品一区二区色综合朱莉 | 国产欧美日韩精品在线| 欧美韩国日本综合| 亚洲天堂成人在线观看| 亚洲一区二区三区四区中文字幕| 亚洲风情在线资源站| 视频一区欧美日韩| 激情综合网av| 99精品视频一区二区三区| 在线观看av一区二区| 欧美一区二区三区小说| 国产欧美精品一区aⅴ影院| 欧美日韩国产另类不卡| 精品理论电影在线| 中文字幕欧美日韩一区| 一区二区三区四区在线播放| 视频一区在线播放| 粉嫩嫩av羞羞动漫久久久 | 色综合中文字幕| 国产午夜亚洲精品羞羞网站| 久久精品亚洲一区二区三区浴池| 国产人久久人人人人爽| 一区二区三区在线免费视频| 奇米影视一区二区三区| 国产米奇在线777精品观看| 99精品视频在线观看免费| 538prom精品视频线放| 国产欧美一区二区三区鸳鸯浴| 洋洋成人永久网站入口| 美美哒免费高清在线观看视频一区二区| 亚洲少妇最新在线视频| 成人av资源网站| 国产精品久久久久影院| 国产在线精品一区二区夜色 | 国产精品九色蝌蚪自拍| 亚洲成人自拍偷拍| 成人h版在线观看| 91在线小视频| 久久久久亚洲蜜桃| 五月天激情综合网| 99精品国产热久久91蜜凸| 精品国产一区二区三区不卡| 一区二区理论电影在线观看| 国产成人综合网站| 欧洲视频一区二区| 国产精品国产成人国产三级 | 日韩成人免费看| 日韩欧美你懂的| 7777精品伊人久久久大香线蕉的| 国产精品国产三级国产aⅴ无密码| 卡一卡二国产精品 | 国产三级精品在线| 日本美女视频一区二区| 欧美午夜精品久久久久久超碰 | 91黄色激情网站| 欧美经典三级视频一区二区三区| 亚洲一级二级三级在线免费观看| 成人av在线资源网| 国产午夜精品一区二区三区视频| 美女高潮久久久| 欧美剧情电影在线观看完整版免费励志电影| 国产香蕉久久精品综合网| 国产做a爰片久久毛片| 日本高清不卡在线观看| 日韩理论片在线| 欧美顶级少妇做爰| 久久97超碰色| 中文字幕视频一区二区三区久| 欧洲国产伦久久久久久久| 天天综合日日夜夜精品| 久久久久久免费毛片精品| 91蜜桃在线观看| 午夜精品久久久久影视| 国产亚洲视频系列| 日本国产一区二区| 九九国产精品视频| 亚洲精品菠萝久久久久久久| 日韩一区二区三区观看| 成人高清视频在线| 日韩主播视频在线| 国产精品白丝在线| 日韩午夜激情视频| 一本大道综合伊人精品热热| 久久精品国产成人一区二区三区| 国产精品日韩精品欧美在线| 7777精品伊人久久久大香线蕉的 | 国产99久久久精品| 午夜在线成人av| 国产精品网友自拍| 日韩欧美在线1卡| 日本久久一区二区| 国产成人免费视频网站高清观看视频 | 一区二区日韩av| 久久无码av三级| 欧美精品xxxxbbbb| av不卡一区二区三区| 久久99精品国产麻豆不卡| 亚洲成av人片一区二区梦乃| 国产精品免费视频一区| 日韩精品最新网址| 欧美日韩1区2区| 欧美性猛片xxxx免费看久爱 | 最新日韩av在线| 久久网站热最新地址| 欧美日本韩国一区二区三区视频 | 欧美色精品天天在线观看视频| 成人一区二区三区视频在线观看 | 国产福利91精品一区| 亚洲bt欧美bt精品777| 亚洲另类在线制服丝袜| 国产精品久久久久久妇女6080| 久久一区二区三区四区| 日韩一级精品视频在线观看| 欧美日本视频在线| 欧美精品三级在线观看| 精品视频在线免费看| 欧美三级一区二区| 欧美无砖砖区免费| 欧美日本在线看| 91看片淫黄大片一级在线观看| 国产乱淫av一区二区三区| 亚洲免费观看高清完整| 中文字幕不卡在线| 51精品国自产在线| 欧美日韩你懂的| 欧美美女bb生活片| 欧美一卡二卡在线| 欧美不卡激情三级在线观看| 精品国产乱码久久久久久图片 | 色嗨嗨av一区二区三区| 91免费观看视频在线| 欧美私人免费视频| 欧美精品乱码久久久久久| 欧美一区二区日韩| 久久精品亚洲乱码伦伦中文| 国产女主播一区| 亚洲精品亚洲人成人网 | 3d动漫精品啪啪一区二区竹菊| 欧美精品在线观看一区二区| 26uuu精品一区二区| 精品国产网站在线观看| 欧美亚洲国产bt| 国产精品私房写真福利视频| 亚洲三级在线看| 天堂一区二区在线免费观看| 久久99热这里只有精品| 国产成人夜色高潮福利影视| 91在线播放网址| 欧美午夜精品免费| 2023国产精华国产精品| 亚洲三级视频在线观看| 美国毛片一区二区三区| 粉嫩嫩av羞羞动漫久久久| 欧美日韩免费不卡视频一区二区三区| 欧美一区二区女人| 中文字幕视频一区| 久久精品国产免费看久久精品| 97se亚洲国产综合自在线不卡| 91精品一区二区三区久久久久久 | 国产麻豆午夜三级精品| 色老汉一区二区三区|