999国内精品永久免费视频,色偷偷9999www,亚洲国产成人爱av在线播放,6080亚洲人久久精品,欧美超高清xxxhd

首頁(yè) 新聞 工控搜 論壇 廠商論壇 產(chǎn)品 方案 廠商 人才 文摘 下載 展覽
中華工控網(wǎng)首頁(yè)
  P L C | 變頻器與傳動(dòng) | 傳感器 | 現(xiàn)場(chǎng)檢測(cè)儀表 | 工控軟件 | 人機(jī)界面 | 運(yùn)動(dòng)控制
  D C S | 工業(yè)以太網(wǎng) | 現(xiàn)場(chǎng)總線 | 顯示調(diào)節(jié)儀表 | 數(shù)據(jù)采集 | 數(shù)傳測(cè)控 | 工業(yè)安全
  電 源 | 嵌入式系統(tǒng) | PC based | 機(jī)柜箱體殼體 | 低壓電器 | 機(jī)器視覺(jué)
基于WinTAPI的調(diào)制解調(diào)器編程
中華工控網(wǎng)
收藏本文     查看收藏
基 于Win95 TAPI 的 調(diào) 制 解 調(diào) 器 編 程 <BR> 譚 安 平----中 國(guó) 科 學(xué) 院 近 代 物 理 研 究 所( 7 3 0 0 0 0) <BR> 一、 簡(jiǎn) 介:<BR> ---- 隨 著Win95 操 作 系 統(tǒng) 的 普 及, 計(jì) 算 機(jī) 之 間 的 通 信 已 經(jīng) 成 為 大 多 數(shù) 應(yīng) 用 程 序 開(kāi) 發(fā) 的 要 求, 這 其 中 的 主 要 原 因 是Win95 不 僅 僅 能 夠 支 持 大 多 數(shù) 硬 件, 而 且 為 硬 件 的 操 作 提 供 了 方 便 的 編 程 接 口(API),Win95 的 應(yīng) 用 程 序 接 口(API) 提 供 的 通 信 手 段 大 致 分 為 以 下 幾 類: 1 基 于TCP/IP 協(xié) 議 的Winsock API, 可 實(shí) 現(xiàn) 局 域 網(wǎng) 上 或 互 聯(lián) 網(wǎng) 上 的 微 機(jī) 通 信; 2 基 于 進(jìn) 程 之 間 的 通 信 技 術(shù): 動(dòng) 態(tài) 數(shù) 據(jù) 交 換( D D E); 3 基 于 直 接 電 纜 連 接 的 通 信 技 術(shù), 可 直 接 操 作 串 行 口、 并 行 口 以 及 遠(yuǎn) 紅 外 線 接 口; 4 基 于 電 話 線 路 的 通 信 應(yīng) 用 程 序 接 口( T A P I/Telephony API), 可 方 便 地 控 制 調(diào) 制 解 調(diào) 器; 從 目 前 的 發(fā) 展 狀 況 看 來(lái), 調(diào) 制 解 調(diào) 器 已 經(jīng) 成 為 遠(yuǎn) 距 離 通 信 的 一 種 重 要 工 具, 為 此Microsoft 及Intel 公 司 聯(lián) 合 開(kāi) 發(fā) 了TAPI 這 樣 一 個(gè) 編 程 接 口, 而 且, 使 用API 函 數(shù) 編 制 的 程 序 段 既 適 用 于Borland C++ 編 譯 器, 同 時(shí) 也 能 插 入Visual C++ 程 序 中 編 譯 運(yùn) 行, 作 為Win95 的 應(yīng) 用 程 序 編 制 人 員, 學(xué) 會(huì) 使 用TAPI 編 程 操 作 調(diào) 制 解 調(diào) 器 通 過(guò) 電 話 線 路 進(jìn) 行 通 信 這 一 技 術(shù) 是 很 有 必 要 的。 下 面 就TAPI 編 程 進(jìn) 行 討 論: </P><P> 二、 通 信 過(guò) 程 描 述<BR> ---- 1 初 始 化 線 路( 通 信 雙 方 都 應(yīng) 該 初 始 化 線 路) <BR> ---- 通 過(guò) 使 用lineInitialize 函 數(shù) 初 始 化TAPI.DLL 得 到TAPI 使 用 句 柄 的 指 針hTapi, 請(qǐng) 注 意 參 數(shù) 中 回 調(diào) 函 數(shù) 的 定 義( 所 有 提 及 函 數(shù) 的 用 法 均 可 從BC++5.0 及Visual C++5.0 的 幫 助 中 獲 得); 通 過(guò) 調(diào) 用lineOpen 函 數(shù)( 用 到 參 數(shù)hTapi) 獲 得 線 路 句 柄hLine; 再 利 用lineGetID( 用 到 參 數(shù)hLine) 獲 取 調(diào) 制 解 調(diào) 器 句 柄hModem </P><P> ---- 2 配 置 線 路( 可 選) </P><P> ---- </P><P> ---- 調(diào) 用SetCommConfig( 用 到hModem) 改 變 調(diào) 制 解 調(diào) 器 的 設(shè) 置 </P><P> ---- 3 撥 號(hào)( 由 呼 叫 方 執(zhí) 行) </P><P> ---- 使 用lineMakeCall 函 數(shù)( 用 到hLine) 進(jìn) 行 撥 號(hào), 完 成 后 獲 得 呼 叫 句 柄hCall( 呼 叫 方 的 呼 叫 句 柄) </P><P> ---- 4 應(yīng) 答 鏈 接( 由 被 呼 叫 方 執(zhí) 行) </P><P> ---- 被 呼 叫 的 一 方 的 回 調(diào) 函 數(shù) 得 到LINECALLSTATE_OFFERING 消 息 時(shí), 調(diào) 用lineAnswer 函 數(shù) 實(shí) 現(xiàn) 自 動(dòng) 應(yīng) 答( 呼 叫 句 柄hCall 由 回 調(diào) 函 數(shù) 的 參 數(shù) 給 出) </P><P> ---- 5 數(shù) 據(jù) 通 信( 雙 方) </P><P> ---- 當(dāng) 回 調(diào) 函 數(shù) 收 到LINECALLSTATE_CONNECTED 消 息 后, 請(qǐng) 先 清 除 接 收 緩 沖 區(qū), 可 以 使 用 函 數(shù) 為WriteFile 及ReadFile 函 數(shù) 進(jìn) 行 數(shù) 據(jù) 交 換, 注 意 參 數(shù)hFile 為 調(diào) 制 解 調(diào) 器 句 柄hModem </P><P> ---- 6 掛 機(jī)( 某 一 方) </P><P> ---- 通 信 完 畢 任 何 一 方 都 可 以 調(diào) 用 函 數(shù)lineDrop(hCall,NULL,0) 來(lái) 停 止 呼 叫, 該 函 數(shù) 還 發(fā) 送LINECALLSTATE_IDLE 消 息 給 回 調(diào) 函 數(shù) </P><P> ---- 7 關(guān) 閉 線 路( 雙 方) </P><P> ---- 通 信 雙 方 的 回 調(diào) 函 數(shù) 在 收 到LINECALLSTATE_IDLE 消 息 時(shí) 都 應(yīng) 該 調(diào) 用 函 數(shù)lineDeallocateCall(hCall) 釋 放 相 應(yīng) 呼 叫 占 用 的 資 源; 當(dāng) 回 調(diào) 函 數(shù) 收 到LINECALLSTATE_DISCONNECTED 消 息 時(shí) 請(qǐng) 使 用lineClose(hLine) 釋 放 由lineOpen 分 配 的 資 源, 調(diào) 用lineShutDown(hTapi) 釋 放 為 線 路 設(shè) 備 分 配 的 資 源 </P><P> 三、 軟 硬 件 環(huán) 境<BR> ---- 下 圖 示 意 出 了 我 們 的 應(yīng) 用 程 序 所 處 的 位 置 以 及 涉 及 到 的 軟 硬 件 環(huán) 境: <BR> ---- 我 們 的 通 信 應(yīng) 用 程 序 通 過(guò)TAPI 操 作Modem 撥 號(hào)、 應(yīng) 答、 鏈 接、 掛 機(jī) 控 制 電 話 呼 叫, 在 編 制DOS 應(yīng) 用 程 序 的 時(shí) 候, 我 們 經(jīng) 常 使 用Hayes 兼 容 的AT 命 令 集 來(lái) 完 成 這 些 操 作, 由 于 各 調(diào) 制 解 調(diào) 器 廠 家 對(duì) 該 命 令 集 都 做 了 各 自 的 擴(kuò) 展, 因 而, 我 們 的DOS 應(yīng) 用 程 序 一 般 只 能 操 作 一 小 部 分 調(diào) 制 解 調(diào) 器, 而 各 廠 家 都 提 供Windows 驅(qū) 動(dòng) 程 序, 所 以, 使 用TAPI 編 制 的 應(yīng) 用 程 序 能 夠 操 作 絕 大 多 數(shù) 調(diào) 制 解 調(diào) 器; 圖 中 的 通 信API 是 應(yīng) 用 程 序 發(fā) 送、 接 收 數(shù) 據(jù) 的 編 程 接 口。 </P><P> 四、 程 序 流 程 結(jié) 構(gòu) 框 圖<BR> ---- 由 于Win95 為 多 任 務(wù) 操 作 系 統(tǒng), 我 們 的 流 程 圖 只 能 代 表 本 應(yīng) 用 程 序 的 執(zhí) 行 先 后 關(guān) 系, 程 序 中 的 等 待 及 檢 測(cè) 實(shí) 際 上 是 等 待Win95 提 供 的 消 息, 所 以 并 不 占 用CPU 時(shí) 間, 在 下 面 的 程 序 中 可 以 看 出。 另 外, 數(shù) 據(jù) 交 換 的 協(xié) 議 可 由 自 己 制 定, 也 可 使 用 已 有 的 協(xié) 議。 <BR> 五、 軟 件 編 制<BR> ---- 由 于Windows 編 程 的 框 架 基 本 相 同, 在 此 我 們 只 介 紹 涉 及 到 通 信 的 一 部 分 源 程 序: <BR> ---- 1 頭 文 件 中 應(yīng) 該 包 括: </P><P> ---- #include < tapi.h > </P><P> ---- 請(qǐng) 注 意 工 程 文 件 的 屬 性 應(yīng) 該 是Windows 32 位 應(yīng) 用 程 序 </P><P> ---- 2 通 信 所 涉 及 到 的 一 些 全 局 變 量 定 義 及 類 型 定 義: </P><P> char RecBuf[20],buf[20]// 緩 沖 區(qū)<BR> DWORD Error; // 錯(cuò) 誤 碼<BR> COMSTAT Status; // 狀 態(tài) 碼<BR> DWORD NumLine; // 允 許 使 用 的 線 路 設(shè) 備 數(shù)<BR> LINECALLPARAMS para;// 呼 叫 參 數(shù)<BR> TmyDecFrame * pwin=NULL;// 主 窗 口 指 針<BR> HLINEAPP myhTapi;// 線 路 應(yīng) 用 程 序 句 柄<BR> HLINE myhLine;// 線 路 句 柄<BR> HANDLE myhModem;// 調(diào) 制 解 調(diào) 器 句 柄<BR> HCALL myhCall;// 呼 叫 句 柄</P><P> typedef struct tagModemID{<BR>   HANDLE hModem;<BR>   char ModemName[1];<BR> }ModemID;</P><P> ---- 3 下 面 為 獲 取 調(diào) 制 解 調(diào) 器 句 柄 的 函 數(shù) 定 義 </P><P> ---- 因 為 每 個(gè) 調(diào) 制 解 調(diào) 器 的 標(biāo) 志 字 符 串 長(zhǎng) 度 不 一, 所 以 函 數(shù) 中 用 到 了 可 變 長(zhǎng) 度 的 字 符 串, 處 理 方 法 是 先 為 字 符 串 指 針 分 配sizeof(VARSTRING) 大 小 的 空 間, 再 利 用 該 空 間 容 納 調(diào) 用LineGetID 時(shí)Windows 返 回 的 信 息, 根 據(jù) 返 回 信 息 判 斷 所 需 空 間 大 小 重 新 分 配 空 間, 再 次 調(diào) 用LineGetID 就 可 以 取 得 完 整 的 標(biāo) 志 字 符 串。 </P><P> void GethModem(HLINE hLine)<BR> {  ModemID far *mid;<BR>    VARSTRING * str;<BR>    LONG lid;<BR>   DWORD size;<BR>    char mark=1;<BR>  <BR>    str=(VARSTRING *)malloc(sizeof(VARSTRING));<BR>    if(!str) <BR> return NULL;<BR>   str- >dwTotalSize=sizeof(VARSTRING);<BR>    do<BR>    { if((lineGetID(myhLine,0,NULL,LINECALLSELECT_LINE,str,<BR> "comm/datamodem")==0)&&(str- >dwTotalSize < str- > dwNeededSize))<BR>    { dwSize=str- >dwNeededSize;<BR>       free(str);<BR>      str=(VARSTRING *)malloc(dwSize);<BR>    if(!str)<BR>       { myhModem=NULL;<BR>      mark=2;<BR> }<BR> str- >dwTotalSize=dwSize;<BR>    }<BR>    else mark=0;<BR>  }while(mark==1);<BR>    if(mark==0)<BR>    { mid=(ModemID far *)((LPSTR)str+str- >dwStringOffset);<BR>     myhModem=mid- >hModem;<BR>    }<BR>    free(str);<BR> }</P><P> ---- 4 在 主 窗 口 初 始 化 函 數(shù) 中 加 入 對(duì) 線 路 的 初 始 化 過(guò) 程: </P><P> pwin=this;// 獲 得 主 窗 口 指 針<BR>  while(lineInitialize(&myhTAPI,GetModule()- >GetInstance(),<BR>    (LINECALLBACK)MakeProcInstance((FARPROC) lpfnCallback,<BR>  GetModule()- >GetInstance()), "TRY",&NumLine )==LINEERR_REINIT)<BR>  { sleep(1);// 延 遲  };<BR>  Error=lineOpen(hTAPI,0,&HLine,0x10004,0,0,LINECALLPRIVILEGE_MONITOR+<BR> LINECALLPRIVILEGE_OWNER,LINEMEDIAMODE_DATAMODEM,NULL);<BR>   if(Error!=0)<BR>   { sprintf(buf,"%lx",Error);<BR> MessageBox(buf,0,MB_OK); }<BR>   else<BR>   { GethModem(myhLine);// 取 得myhModem 的 值<BR>    if(myhModem!=NULL)<BR>    {  para.dwBearerMode=LINEBEARERMODE_VOICE;<BR>  para.dwMediaMode=LINEMEDIAMODE_DATAMODEM;<BR>   para.dwTotalSize=sizeof(LINECALLPARAMS);<BR>     Error=lineMakeCall(myhLine,&myhCall,"8880751",0,¶);<BR>     If(Error!=0)<BR>     { sprintf(buf,"%lx",Error);<BR>      MessageBox(buf,0,MB_OK); }<BR>    }<BR>   }<BR>  }</P><P> ---- 5 呼 叫 方 回 調(diào) 函 數(shù) 的 定 義 </P><P> void far pascal TMyDecFrame::lpfnCallback<BR> (DWORD hDevice, DWORD dwMsg,<BR> DWORD dwCallbackInstance, <BR> DWORD dwParam1, DWORD dwParam2,<BR> DWORD dwParam3)// <BR> 參數(shù)定義同lineCallbackFunc函數(shù)中的參數(shù)定義<BR> {  int Rec_num=0;</P><P>  switch(dwParam1)<BR>  { case LINECALLSTATE_CONNECTED:<BR> DWORD len;<BR>    ClearCommError(myhModem,&Error,&Status);<BR>  Rec_num=Status.cbInQue;<BR>    ReadFile(myhModem,RecBuf,Rec_num,&len,0);<BR> //至此已經(jīng)為數(shù)據(jù)通信做好了前期準(zhǔn)備,可設(shè)立標(biāo)志<BR>   WriteFile(myhModem,"Success",7,&len,0);<BR>    ReadFile(myhModem,RecBuf,8,&len,0);<BR>    pwin->MessageBox(RecBuf,0,MB_OK);<BR> break;<BR>   case LINECALLSTATE_IDLE:<BR>    lineDeallocateCall(myhCall);<BR>    break;<BR> case LINECALLSTATE_DISCONNECTED:<BR>  lineClose(myhLine);<BR>  lineShutDown(myhTapi);<BR>  break;<BR> }<BR> }</P><P> ---- 6 被 叫 方 回 調(diào) 函 數(shù) 的 定 義 </P><P> void far pascal TMyDecFrame::lpfnCallback(DWORD hDevice, DWORD dwMsg,<BR>   DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2,<BR>   DWORD dwParam3)<BR> { int Rec_num=0;</P><P>  switch(dwParam3)<BR>  { case LINECALLPRIVILEGE_OWNER:<BR>    myhCall=(HCALL)hDevice;<BR>    Break;<BR>  }//只有對(duì)呼叫具有私有特權(quán)的調(diào)用者才能應(yīng)答呼叫,<BR> 在此獲得呼叫句柄<BR>  switch(dwParam1)<BR>  { case LINECALLSTATE_CONNECTED:<BR>  DWORD len;<BR>     ClearCommError(myhModem,&Error,&Status);<BR>  Rec_num=ComS.cbInQue;<BR>   ReadFile(myhModem,RecBuf,Rec_num,&len,0);// 清 除 接 收 緩 沖 區(qū)<BR>    ReadFile(myhModem,RecBuf,7,&len,0);<BR>   WriteFile(myhModem,"Received",8,&len,0);<BR>    pwin- >MessageBox(RecBuf,0,MB_OK);<BR>  break;<BR>   case LINECALLSTE_OFFERING:<BR>    lineAnswer(myhCall,NULL,0);<BR>    break;// 完 成 自 動(dòng) 應(yīng) 答<BR>   case LINECALLSTATE_IDLE:<BR>    lineDeallocateCall(myhCall);<BR>    break;<BR> case LINECALLSTATE_DISCONNECTED:<BR>  lineClose(myhLine);<BR>  lineShutDown(myhTapi);<BR>  break;<BR>   }<BR> }</P><P> 六、 改 進(jìn) 措 施<BR> ---- 以 上 程 序 中 使 用 的 是 同 步 讀 寫 方 式, 只 要WriteFile 或 者ReadFile 沒(méi) 有 完 成 指 定 的I/O 任 務(wù), 它 們 就 不 會(huì) 返 回 進(jìn) 程, 在 許 多 情 況 下, 這 是 令 人 難 以 容 忍 的CPU 時(shí) 間 浪 費(fèi); 改 進(jìn) 的 辦 法 是 在 每 次 讀 之 前 采 用ClearCommError 函 數(shù) 確 定 系 統(tǒng) 的 串 行 口 緩 沖 區(qū) 中 到 底 有 了 多 少 字 節(jié) 的 接 收 數(shù) 據(jù), 而 寫 方 式 采 用 異 步 方 式, 首 先 應(yīng) 該 定 義 一 個(gè)OVERLAPPED 結(jié) 構(gòu), 從BC++5.0 中 獲 得 的 結(jié) 構(gòu) 定 義 如 下: <BR> typedef struct _OVERLAPPED { // o <BR> DWORD Internal; <BR> DWORD InternalHigh; <BR> DWORD Offset; <BR> DWORD OffsetHigh; <BR> HANDLE hEvent; <BR> } OVERLAPPED; </P><P> ---- 我 們 定 義OVERLAPPED myOVLP; </P><P> ---- 我 們 只 用 到 了 其 中 的hEvent 成 員, 其 他 成 員 均 置0;hEvent 設(shè) 置 為CreateEvent(NULL,TRUE,F(xiàn)ALSE,NULL) 產(chǎn) 生 的 事 件 句 柄; 然 后 如 下 調(diào) 用WriteFile(myhModem,"Received",8,&len,&myOVLP); </P><P> ---- 函 數(shù) 將 立 即 返 回, 此 后, 只 要GetOverlappedResult 函 數(shù) 返 回TRUE, 寫操作就 算 完 成 了。 </P><P>
 

狀 態(tài): 離線

公司簡(jiǎn)介
產(chǎn)品目錄

公司名稱: 中華工控網(wǎng)
聯(lián) 系 人: 客服中心
電  話: 0755-26546361
傳  真: 0755-26585268
地  址: 深圳市南山區(qū)創(chuàng)業(yè)路現(xiàn)代城華庭1棟6A
郵  編: 518054
主  頁(yè):
 
該廠商相關(guān)技術(shù)文摘:
智能儀器儀表的發(fā)展特點(diǎn)與前景分析
電動(dòng)機(jī)性能虛擬儀器測(cè)試系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
視頻監(jiān)控護(hù)航高鐵安全運(yùn)營(yíng)
基于PLC,觸摸屏及變頻器對(duì)吹膜機(jī)的改造
永宏P(guān)LC應(yīng)用于自助圖書借還終端機(jī)
基于永宏P(guān)LC的GSM通訊原理及其應(yīng)用
改善汽車生態(tài)學(xué)、安全性和舒適性,四大測(cè)試分析是關(guān)鍵
改善汽車生態(tài)學(xué)、安全性和舒適性,四大測(cè)試分析是關(guān)鍵
數(shù)控技術(shù)的發(fā)展趨勢(shì)及產(chǎn)業(yè)化
數(shù)控技術(shù)發(fā)展戰(zhàn)略與發(fā)展途徑的思考
用Energid 的軟件進(jìn)行機(jī)器人的抓取和操作
如何借助RFID技術(shù)升級(jí)企業(yè)信息管理水平
更多文摘...
立即發(fā)送詢問(wèn)信息在線聯(lián)系該技術(shù)文摘廠商:
用戶名: 密碼: 免費(fèi)注冊(cè)為中華工控網(wǎng)會(huì)員
請(qǐng)留下您的有效聯(lián)系方式,以方便我們及時(shí)與您聯(lián)絡(luò)

關(guān)于我們 | 聯(lián)系我們 | 廣告服務(wù) | 本站動(dòng)態(tài) | 友情鏈接 | 法律聲明 | 不良信息舉報(bào)
工控網(wǎng)客服熱線:0755-86369299
版權(quán)所有 中華工控網(wǎng) Copyright©2022 Gkong.com, All Rights Reserved