<nobr id="zkazv"></nobr>

      午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al
      首頁 新聞 工控搜 論壇 廠商論壇 產品 方案 廠商 人才 文摘 下載 展覽
      中華工控網首頁
        P L C | 變頻器與傳動 | 傳感器 | 現場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
        D C S | 工業以太網 | 現場總線 | 顯示調節儀表 | 數據采集 | 數傳測控 | 工業安全
        電 源 | 嵌入式系統 | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
      基于WinTAPI的調制解調器編程
      中華工控網
      收藏本文     查看收藏
      基 于Win95 TAPI 的 調 制 解 調 器 編 程 <BR> 譚 安 平----中 國 科 學 院 近 代 物 理 研 究 所( 7 3 0 0 0 0) <BR> 一、 簡 介:<BR> ---- 隨 著Win95 操 作 系 統 的 普 及, 計 算 機 之 間 的 通 信 已 經 成 為 大 多 數 應 用 程 序 開 發 的 要 求, 這 其 中 的 主 要 原 因 是Win95 不 僅 僅 能 夠 支 持 大 多 數 硬 件, 而 且 為 硬 件 的 操 作 提 供 了 方 便 的 編 程 接 口(API),Win95 的 應 用 程 序 接 口(API) 提 供 的 通 信 手 段 大 致 分 為 以 下 幾 類: 1 基 于TCP/IP 協 議 的Winsock API, 可 實 現 局 域 網 上 或 互 聯 網 上 的 微 機 通 信; 2 基 于 進 程 之 間 的 通 信 技 術: 動 態 數 據 交 換( D D E); 3 基 于 直 接 電 纜 連 接 的 通 信 技 術, 可 直 接 操 作 串 行 口、 并 行 口 以 及 遠 紅 外 線 接 口; 4 基 于 電 話 線 路 的 通 信 應 用 程 序 接 口( T A P I/Telephony API), 可 方 便 地 控 制 調 制 解 調 器; 從 目 前 的 發 展 狀 況 看 來, 調 制 解 調 器 已 經 成 為 遠 距 離 通 信 的 一 種 重 要 工 具, 為 此Microsoft 及Intel 公 司 聯 合 開 發 了TAPI 這 樣 一 個 編 程 接 口, 而 且, 使 用API 函 數 編 制 的 程 序 段 既 適 用 于Borland C++ 編 譯 器, 同 時 也 能 插 入Visual C++ 程 序 中 編 譯 運 行, 作 為Win95 的 應 用 程 序 編 制 人 員, 學 會 使 用TAPI 編 程 操 作 調 制 解 調 器 通 過 電 話 線 路 進 行 通 信 這 一 技 術 是 很 有 必 要 的。 下 面 就TAPI 編 程 進 行 討 論: </P><P> 二、 通 信 過 程 描 述<BR> ---- 1 初 始 化 線 路( 通 信 雙 方 都 應 該 初 始 化 線 路) <BR> ---- 通 過 使 用lineInitialize 函 數 初 始 化TAPI.DLL 得 到TAPI 使 用 句 柄 的 指 針hTapi, 請 注 意 參 數 中 回 調 函 數 的 定 義( 所 有 提 及 函 數 的 用 法 均 可 從BC++5.0 及Visual C++5.0 的 幫 助 中 獲 得); 通 過 調 用lineOpen 函 數( 用 到 參 數hTapi) 獲 得 線 路 句 柄hLine; 再 利 用lineGetID( 用 到 參 數hLine) 獲 取 調 制 解 調 器 句 柄hModem </P><P> ---- 2 配 置 線 路( 可 選) </P><P> ---- </P><P> ---- 調 用SetCommConfig( 用 到hModem) 改 變 調 制 解 調 器 的 設 置 </P><P> ---- 3 撥 號( 由 呼 叫 方 執 行) </P><P> ---- 使 用lineMakeCall 函 數( 用 到hLine) 進 行 撥 號, 完 成 后 獲 得 呼 叫 句 柄hCall( 呼 叫 方 的 呼 叫 句 柄) </P><P> ---- 4 應 答 鏈 接( 由 被 呼 叫 方 執 行) </P><P> ---- 被 呼 叫 的 一 方 的 回 調 函 數 得 到LINECALLSTATE_OFFERING 消 息 時, 調 用lineAnswer 函 數 實 現 自 動 應 答( 呼 叫 句 柄hCall 由 回 調 函 數 的 參 數 給 出) </P><P> ---- 5 數 據 通 信( 雙 方) </P><P> ---- 當 回 調 函 數 收 到LINECALLSTATE_CONNECTED 消 息 后, 請 先 清 除 接 收 緩 沖 區, 可 以 使 用 函 數 為WriteFile 及ReadFile 函 數 進 行 數 據 交 換, 注 意 參 數hFile 為 調 制 解 調 器 句 柄hModem </P><P> ---- 6 掛 機( 某 一 方) </P><P> ---- 通 信 完 畢 任 何 一 方 都 可 以 調 用 函 數lineDrop(hCall,NULL,0) 來 停 止 呼 叫, 該 函 數 還 發 送LINECALLSTATE_IDLE 消 息 給 回 調 函 數 </P><P> ---- 7 關 閉 線 路( 雙 方) </P><P> ---- 通 信 雙 方 的 回 調 函 數 在 收 到LINECALLSTATE_IDLE 消 息 時 都 應 該 調 用 函 數lineDeallocateCall(hCall) 釋 放 相 應 呼 叫 占 用 的 資 源; 當 回 調 函 數 收 到LINECALLSTATE_DISCONNECTED 消 息 時 請 使 用lineClose(hLine) 釋 放 由lineOpen 分 配 的 資 源, 調 用lineShutDown(hTapi) 釋 放 為 線 路 設 備 分 配 的 資 源 </P><P> 三、 軟 硬 件 環 境<BR> ---- 下 圖 示 意 出 了 我 們 的 應 用 程 序 所 處 的 位 置 以 及 涉 及 到 的 軟 硬 件 環 境: <BR> ---- 我 們 的 通 信 應 用 程 序 通 過TAPI 操 作Modem 撥 號、 應 答、 鏈 接、 掛 機 控 制 電 話 呼 叫, 在 編 制DOS 應 用 程 序 的 時 候, 我 們 經 常 使 用Hayes 兼 容 的AT 命 令 集 來 完 成 這 些 操 作, 由 于 各 調 制 解 調 器 廠 家 對 該 命 令 集 都 做 了 各 自 的 擴 展, 因 而, 我 們 的DOS 應 用 程 序 一 般 只 能 操 作 一 小 部 分 調 制 解 調 器, 而 各 廠 家 都 提 供Windows 驅 動 程 序, 所 以, 使 用TAPI 編 制 的 應 用 程 序 能 夠 操 作 絕 大 多 數 調 制 解 調 器; 圖 中 的 通 信API 是 應 用 程 序 發 送、 接 收 數 據 的 編 程 接 口。 </P><P> 四、 程 序 流 程 結 構 框 圖<BR> ---- 由 于Win95 為 多 任 務 操 作 系 統, 我 們 的 流 程 圖 只 能 代 表 本 應 用 程 序 的 執 行 先 后 關 系, 程 序 中 的 等 待 及 檢 測 實 際 上 是 等 待Win95 提 供 的 消 息, 所 以 并 不 占 用CPU 時 間, 在 下 面 的 程 序 中 可 以 看 出。 另 外, 數 據 交 換 的 協 議 可 由 自 己 制 定, 也 可 使 用 已 有 的 協 議。 <BR> 五、 軟 件 編 制<BR> ---- 由 于Windows 編 程 的 框 架 基 本 相 同, 在 此 我 們 只 介 紹 涉 及 到 通 信 的 一 部 分 源 程 序: <BR> ---- 1 頭 文 件 中 應 該 包 括: </P><P> ---- #include < tapi.h > </P><P> ---- 請 注 意 工 程 文 件 的 屬 性 應 該 是Windows 32 位 應 用 程 序 </P><P> ---- 2 通 信 所 涉 及 到 的 一 些 全 局 變 量 定 義 及 類 型 定 義: </P><P> char RecBuf[20],buf[20]// 緩 沖 區<BR> DWORD Error; // 錯 誤 碼<BR> COMSTAT Status; // 狀 態 碼<BR> DWORD NumLine; // 允 許 使 用 的 線 路 設 備 數<BR> LINECALLPARAMS para;// 呼 叫 參 數<BR> TmyDecFrame * pwin=NULL;// 主 窗 口 指 針<BR> HLINEAPP myhTapi;// 線 路 應 用 程 序 句 柄<BR> HLINE myhLine;// 線 路 句 柄<BR> HANDLE myhModem;// 調 制 解 調 器 句 柄<BR> HCALL myhCall;// 呼 叫 句 柄</P><P> typedef struct tagModemID{<BR>   HANDLE hModem;<BR>   char ModemName[1];<BR> }ModemID;</P><P> ---- 3 下 面 為 獲 取 調 制 解 調 器 句 柄 的 函 數 定 義 </P><P> ---- 因 為 每 個 調 制 解 調 器 的 標 志 字 符 串 長 度 不 一, 所 以 函 數 中 用 到 了 可 變 長 度 的 字 符 串, 處 理 方 法 是 先 為 字 符 串 指 針 分 配sizeof(VARSTRING) 大 小 的 空 間, 再 利 用 該 空 間 容 納 調 用LineGetID 時Windows 返 回 的 信 息, 根 據 返 回 信 息 判 斷 所 需 空 間 大 小 重 新 分 配 空 間, 再 次 調 用LineGetID 就 可 以 取 得 完 整 的 標 志 字 符 串。 </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 在 主 窗 口 初 始 化 函 數 中 加 入 對 線 路 的 初 始 化 過 程: </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 呼 叫 方 回 調 函 數 的 定 義 </P><P> void far pascal TMyDecFrame::lpfnCallback<BR> (DWORD hDevice, DWORD dwMsg,<BR> DWORD dwCallbackInstance, <BR> DWORD dwParam1, DWORD dwParam2,<BR> DWORD dwParam3)// <BR> 參數定義同lineCallbackFunc函數中的參數定義<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> //至此已經為數據通信做好了前期準備,可設立標志<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 被 叫 方 回 調 函 數 的 定 義 </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>  }//只有對呼叫具有私有特權的調用者才能應答呼叫,<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);// 清 除 接 收 緩 沖 區<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;// 完 成 自 動 應 答<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> 六、 改 進 措 施<BR> ---- 以 上 程 序 中 使 用 的 是 同 步 讀 寫 方 式, 只 要WriteFile 或 者ReadFile 沒 有 完 成 指 定 的I/O 任 務, 它 們 就 不 會 返 回 進 程, 在 許 多 情 況 下, 這 是 令 人 難 以 容 忍 的CPU 時 間 浪 費; 改 進 的 辦 法 是 在 每 次 讀 之 前 采 用ClearCommError 函 數 確 定 系 統 的 串 行 口 緩 沖 區 中 到 底 有 了 多 少 字 節 的 接 收 數 據, 而 寫 方 式 采 用 異 步 方 式, 首 先 應 該 定 義 一 個OVERLAPPED 結 構, 從BC++5.0 中 獲 得 的 結 構 定 義 如 下: <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 設 置 為CreateEvent(NULL,TRUE,FALSE,NULL) 產 生 的 事 件 句 柄; 然 后 如 下 調 用WriteFile(myhModem,"Received",8,&len,&myOVLP); </P><P> ---- 函 數 將 立 即 返 回, 此 后, 只 要GetOverlappedResult 函 數 返 回TRUE, 寫操作就 算 完 成 了。 </P><P>
       

      狀 態: 離線

      公司簡介
      產品目錄

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

      關于我們 | 聯系我們 | 廣告服務 | 本站動態 | 友情鏈接 | 法律聲明 | 不良信息舉報
      工控網客服熱線:0755-86369299
      版權所有 中華工控網 Copyright©2022 Gkong.com, All Rights Reserved

      主站蜘蛛池模板: 中文字幕人妻日韩精品| 国产无码高清视频不卡| 国产啪视频免费观看视频| 国产一国产精品免费播放| 国产福利微视频一区二区| 四虎成人精品无码| AV无码不卡一区二区三区| 2021av在线| 一区二区和激情视频| 亚洲欧美综合人成在线| 最新国产精品中文字幕| 久久老熟女一区二区蜜臀| 国产精品99一区二区三区| 色偷偷成人综合亚洲精品| 日本在线 | 中文| 中文字幕乱码中文乱码毛片| 久久精产国品一二三产品| 最近免费中文字幕大全| 在线看免费无码的av天堂| 欧美牲交A欧美在线| 亚洲一二区制服无码中字| 欧美成人午夜在线观看视频| 亚洲成人av免费一区| 亚洲精品天堂一区二区| 人妻少妇精品视频专区| 日韩人妻无码精品久久| 少妇xxxxx性开放| 99中文字幕国产精品| 人妻中文字幕精品一页| 亚洲狠狠爱一区二区三区| 自拍偷自拍亚洲精品情侣| 亚洲中文字幕综合小综合| 亚洲中文字幕一区精品自| 久久精品熟妇丰满人妻久久| 国产精品福利一区二区久久| 91亚洲国产成人久久精品| 精品自拍偷拍一区二区三区| 91精品蜜臀国产综合久久| 蜜臀av一区二区精品字幕| 久久精品国产99麻豆蜜月| 国产av亚洲一区二区|