freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

期刊會(huì)議論文----一個(gè)windows下基于電話線路的數(shù)據(jù)通信程序的設(shè)計(jì)與實(shí)現(xiàn)—計(jì)算機(jī)畢業(yè)設(shè)計(jì)(編輯修改稿)

2025-01-08 21:02 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 以直接在計(jì)算機(jī)上撥打的號(hào)碼格式。 (6) 開(kāi)始呼叫或是應(yīng)答:應(yīng)用程序調(diào)用 lineMakeCall ( )函數(shù)進(jìn)行呼叫,調(diào)用完成后它將返回帶有擁有者特權(quán)的呼叫句柄,此句柄可用在對(duì)該次呼叫所進(jìn)行的進(jìn)一步操作。應(yīng)用程序通過(guò)調(diào)用 lineAnswer( )函數(shù)來(lái)自動(dòng)應(yīng)答呼叫。 (7) 掛斷呼叫:在呼叫完成后, lineDrop ( )函數(shù)將用來(lái)掛斷呼叫,但是在上一步中得到的擁有者的呼叫句柄并不會(huì)因此釋放,因?yàn)樵诤艚斜粧鞌嘁院螅?第 7 頁(yè) 共 41 頁(yè) 呼叫的句柄還有可能被用在一些后續(xù)的操作中??梢酝ㄟ^(guò) lineDeallocate ( )來(lái)釋放呼叫句柄。 (8) 關(guān)閉線路設(shè)備:應(yīng)用程序調(diào)用 lineClose ( ) 函數(shù)來(lái)關(guān)閉被 lineOpen ( )函數(shù)打開(kāi)的線路設(shè)備,如果一條線路被應(yīng)用程序打開(kāi)后始終沒(méi)有被關(guān)閉,那么其它的應(yīng)用程序?qū)o(wú)法訪問(wèn)該線路。 (9) 結(jié)束 TAPI 的使用:在一切有關(guān) TAPI 的操作完成之后,調(diào)用lineShutdown()函數(shù)來(lái)終止 TAPI 的使用,它會(huì)隱含地關(guān)閉所以打開(kāi)的線路設(shè)備。 根據(jù) TAPI 的開(kāi)發(fā)基本思路整個(gè)程序的設(shè)計(jì)思路流程如圖 3 圖 3 程序流程圖 第 8 頁(yè) 共 41 頁(yè) 各功能模塊的設(shè)計(jì) TAPI的配置階段 TAPI 的置階段配置階段包括對(duì)線路的配置和對(duì) MODEM 的配置,只有正確地配置并打開(kāi)線路設(shè)備之后,才能對(duì) MODEM 進(jìn)行配置。以下函數(shù)完成對(duì) TAPI 的配置: TAPI 類(lèi)成員函數(shù) telephonylnitialize 分配支持邏輯線路設(shè)備的使用所必須的某些內(nèi)部資源,并返回應(yīng)用程序一個(gè) TAPI 句柄,同時(shí)傳遞了一 個(gè)回調(diào)函數(shù)的地址作為參數(shù),此函數(shù)處理對(duì)整個(gè)線路狀態(tài)進(jìn)行處理。然后使用 TAPI 的類(lèi)成員函數(shù) lineNegotiateAPIVersion 與 Windows 協(xié)商 TAPI 版本。 TAPI 類(lèi)成員函數(shù) mylineGetDevCaps 獲得有關(guān)邏輯線路的性能的信息 Windows 把這些信息填充到一個(gè)名為 LINEDEVCAPS 的只讀結(jié)構(gòu)中,應(yīng)用程序檢查這個(gè)結(jié)構(gòu)就可以了解哪些設(shè)置是驅(qū)動(dòng)程序所允許的 TAPI 類(lèi)成員函數(shù) lineOpen 打開(kāi)線路。 TAPI的連接階段 TPAI 在連接階段 MODEN 會(huì)產(chǎn)生很多消息,消息的處理 TAPI 由回調(diào)函數(shù)進(jìn)行消息處理,回調(diào)函數(shù)在初始化 TAPI 時(shí)創(chuàng)建,消息的處理在 TAPI 的使用過(guò)程中是至關(guān)重要的。以下是一些主要的消息 (1)LINECALLSTATE_IDLE 沒(méi)有呼叫,為空,此時(shí)應(yīng)斷接,釋放掉占用的資源; (2)LINECALLSTATE_DIALING 撥號(hào)中,正在撥號(hào)。 (3)LINECALLSTATE_BUSY 線路忙或設(shè)備忙,此時(shí)應(yīng)斷接,釋放掉占用的資源。 (4)LINECALLSTATE_SPECIALINFO 特別的消息,此時(shí)應(yīng)斷接,釋放掉占用的資源; (5)LINECALLSTATE_OFFERING 應(yīng)答方已收到呼叫方信號(hào),此時(shí)應(yīng)進(jìn)行應(yīng)答,調(diào)用 lineAnswer 函數(shù); (6)LINECALLSTATE_CONNECTED 已連接成功,此時(shí)可進(jìn)行數(shù)據(jù)的傳輸,但必須先得到 MODEM 的句柄 (7)LINECALLSTATE_DISCONNECTED 已斷接,此時(shí)應(yīng)釋放掉占用的資源。 TAPI 類(lèi)成員函數(shù) MakeCall 被用于發(fā)起呼叫,產(chǎn)生呼叫后依次進(jìn)入圖 4 狀態(tài): 第 9 頁(yè) 共 41 頁(yè) 圖 4 狀態(tài)流程圖 新生成的呼叫處于 IDLE 狀態(tài),隨后依次進(jìn)入 PROCEDING, OFFERING, CONNECTED 和 DISCONNECTED 最后 回到 IDLE 狀態(tài)。這些狀態(tài)都通過(guò)在調(diào)telephonylnitialize 函數(shù)初始化 TAPIDLL 的時(shí)候傳遞的回調(diào)函數(shù)來(lái)處理。 數(shù)據(jù)傳送階段 TAPI 并不提供數(shù)據(jù)傳輸?shù)暮瘮?shù)。 因?yàn)? MODEM 通過(guò)控制計(jì)算機(jī)串口來(lái)進(jìn)行通信,所以 MODEM 的數(shù)據(jù)通信與串口數(shù)據(jù)通信的方法一樣,采用 ReadFile 和 writeFile 函數(shù)來(lái)接收數(shù)據(jù)和發(fā)送數(shù)據(jù)。傳送數(shù)據(jù)的時(shí)候要用到 MODEM 的句柄,此時(shí)調(diào)用 TAPI 的類(lèi)成員函數(shù) lineGetID 得到 MODEN 的句柄后就 可以通過(guò)ReadFile 和 WriteFile 函數(shù)來(lái)進(jìn)行數(shù)據(jù)傳輸。 ReadFile 與 WriteFile 有兩種模式,一種是等待模式,一種是非等待模式。 等待模式下 必須完成了 所有 讀寫(xiě)操作函數(shù)才會(huì)返回,最后一個(gè)參數(shù)必須為 NULL。 非等待模式下要先定義一個(gè)OVERLAPPED 變量,并且作為函數(shù)的最后一個(gè)參數(shù)傳遞進(jìn)去。 非等待模式下函數(shù)會(huì)馬上返回, OVERLAPPED 變量在初始化的時(shí)候會(huì)調(diào) CreateEvent 函數(shù)產(chǎn)生一個(gè)事件,當(dāng)函數(shù)返回后我們調(diào)用 WaiForSingObject(Event)函數(shù)讓線程阻塞,當(dāng)數(shù)據(jù)傳送完 以后操作系統(tǒng)會(huì)給應(yīng)用程序發(fā)出一消息,當(dāng)應(yīng)用程序得到此消息以后程序繼續(xù)往下運(yùn)行。 一旦呼叫進(jìn)入 CONNECTED 數(shù)據(jù)鏈路連通狀態(tài),則表明連接已經(jīng)建立。此時(shí) 第 10 頁(yè) 共 41 頁(yè) 我們就可以進(jìn)行數(shù)據(jù)傳輸了,不過(guò)在傳送數(shù)據(jù)之前我們要得到 MODEN 的句柄,此時(shí)調(diào)用 TAPI 的類(lèi)成員函數(shù) lineGetID,此函數(shù)會(huì)把 MODEN 的名稱(chēng)和句柄保存到一個(gè) VARSTRING 類(lèi)型的變量里面。通過(guò)次句柄我們就可以利用 WriteFile 和ReadFile 來(lái)讀寫(xiě)數(shù)據(jù)了。 關(guān)閉連接階段 當(dāng)我們數(shù)據(jù)傳送完成后需要退出程序的時(shí)候。我們會(huì)對(duì)線路進(jìn)行掛斷操作,TAPI 的類(lèi)成員函數(shù) LineDrop 來(lái)斷開(kāi)連接,然后調(diào)用 LineClose 來(lái)關(guān)閉一條打開(kāi)的線路,同時(shí)釋放前面階段操作所用到的一些緩存以及復(fù)位一些信號(hào)型變量。 4 編碼實(shí)現(xiàn) 程序主類(lèi)的的定義 為了使程序的結(jié)構(gòu)更為清晰和易于維護(hù)和升級(jí),我把程序所要使用的數(shù)據(jù)結(jié)構(gòu)封裝成一個(gè)類(lèi)。類(lèi)的定義如下: class CTapiLine { protected: HLINEAPP m_hLineApp。 //TPAIDLL 的句柄 HLINE m_hLine。//線路的句柄 HCALL m_hCall。//呼叫的句柄 int m_nDevID。//設(shè)備號(hào) HANDLE m_hLineEvent。 // 線路改變事件 DWORD m_dwLineMsg。//線路消息 bool m_bConnected。//是否連接 HANDLE m_hEventFromThread。// HANDLE m_hLineMsgThread。 // TAPI 事件監(jiān)聽(tīng)線程 bool m_bStopLineEventThread。 static DWORD WINAPI LineEventThread(LPVOID lpVoid)。 long m_lEventThreadResult。 public: HANDLE GetHandle(const char *szClassType, long *lError)。 int PickupIningCall()。 void GetErrorString(int nError, char *amp。szErrText)。 int MakeOutgoingCall(const char *szAddress)。 int GetIningCall()。 第 11 頁(yè) 共 41 頁(yè) int Close()。 int Open(int nMode = 0)。 CTapiLine()。 virtual ~CTapiLine()。 }。 類(lèi)里面定義了整個(gè)程序運(yùn)行所需要用到的變量。在進(jìn)行線路操作時(shí)調(diào)用TAPI 的類(lèi)成員函數(shù)需要同時(shí)取得設(shè)備和線路的狀態(tài),所以我對(duì) TAPI 的類(lèi)成員函數(shù)進(jìn)行了封裝,使這些操作都模塊化。 線路操作的實(shí)現(xiàn) 線路的操作定義為 Open 和 Close 兩個(gè)類(lèi)成員函數(shù),里面封裝了 TAPI 的lineInitializeEx( TAPI 初始化)、 lineNegotiateAPIVersion(版本協(xié)調(diào))、lineOpen(打開(kāi)一條線路)、 lineDrop(掛斷呼叫)、 lineClose(關(guān)閉一條線路)四個(gè)類(lèi)成員函數(shù)進(jìn)行線路操作,同時(shí)封裝了在 線路操作時(shí)需要用到的設(shè)備性能的取得函數(shù) lineGetDevCaps(取得設(shè)備性能)。 int CTapiLine::Open(int nMode) { ……………………………………………………… // 初始化 TAPI. lRet = lineInitializeEx(amp。m_hLineApp, NULL, NULL, CallAnswer, amp。dwNumDevs, amp。dwTAPIVer, amp。stInitParams)。 m_hLineEvent = 。//得到事件的句柄 m_nDevID = 1。 //通過(guò)循環(huán)取得可以傳送數(shù)據(jù)的設(shè)備號(hào) for(int i=0。idwNumDevs。i++) { lRet=lineNegotiateAPIVersion(m_hLineApp, i, dwTAPIVer, dwTAPIVer, amp。dwTmpVer, amp。stExtID)。 if(lRet != 0) continue。 lpDevCaps=(LINEDEVCAPS*)malloc(sizeof(LINEDEVCAPS)+1024)。// 取得設(shè)備的性能 ……………………………………… 第 12 頁(yè) 共 41 頁(yè) lRet = lineGetDevCaps(m_hLineApp, i, dwTmpVer, 0, lpDevCaps)。 if(lpDevCapsdwMediaModes amp。 dwMediaMode) { free(lpDevCaps)。 m_nDevID = i。 break。 } free(lpDevCaps)。 } if(m_nDevID 0) return LINEERR_BADDEVICEID。 //沒(méi)有可用的設(shè)備 // 打開(kāi)一條線路 lRet = lineOpen(m_hLineApp, m_nDevID, amp。m_hLine, dwTAPIVer, 0x00000000, 1,LINECALLPRIVILEGE_OWNER,dwMediaMode,NULL)。 ……………………………………………… .. } int CTapiLine::Close() {………………………………………… . lineDrop(m_hCall, NULL, 0)。 if(m_hLine) lineClose(m_hLine)。 ………………………………… . //釋放前面階段使用到的一些緩存以及對(duì)一些信號(hào)型變量進(jìn)行復(fù)位 } 呼叫的發(fā)起和應(yīng)答的實(shí)現(xiàn) 呼叫的建立和應(yīng)答使用類(lèi)成員函數(shù) MakeOutgoingCall、 GetIningCall 來(lái)實(shí)現(xiàn)。里面封裝了 lineMakeCall 和 lineAnswer 兩個(gè) TAPI 類(lèi)成員函數(shù)。 int CTapiLine::MakeOutgoingCall(const char *szAddress)//呼出 {//呼叫前對(duì)呼叫選項(xiàng)的設(shè)置 …… ………………………………………………… .. lRet = lineMakeCall(m_hLine, amp。m_hCall, szAddress, 0, lpCallParams)。 return (lRet=0)?0:lRet。 } 第 13 頁(yè) 共 41 頁(yè) int CTapiLine::GetIningCall()//應(yīng)答 {………………………………………………… .. lRet = lineSetNumRings(m_hLine,0,5)。//設(shè)置響鈴次數(shù) lRet = lineAnswer(m_hCall, NULL, 0)。 ………………………………………………… } 數(shù)據(jù)操作的實(shí)現(xiàn) 在程序中數(shù)據(jù)的讀取單獨(dú)創(chuàng)建一個(gè)線程,定義了一個(gè)回調(diào)函數(shù) ReadThread封裝了 WriteFile 和 ReadFile 來(lái)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送。 DWORD WINAPI CMyTapiDlg::ReadThread(LPVOID lpVoid)//接收數(shù)據(jù) { OVERLAPPED ov。 …………………… //ov 的初始化設(shè)置 for(。!pcDlgm_bStopReadThread。) { ReadFile(pcDlgm_hSerialHandle,szBuff,512,amp。dwReadLen,amp。ov)。//讀數(shù)據(jù) …………………………… //錯(cuò)誤處理 switch(WaitForSingleObject(,INFINITE)) { case WAIT_OBJECT_0: GetOverlappedResult(pcDlgm_hSeri
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1