• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. 用Borland C 3.1實(shí)現(xiàn)外設(shè)與Windows應(yīng)用程序?qū)崟r(shí)通信

        時(shí)間:2024-09-03 14:07:50 計(jì)算機(jī)畢業(yè)論文 我要投稿
        • 相關(guān)推薦

        用Borland C 3.1實(shí)現(xiàn)外設(shè)與Windows應(yīng)用程序?qū)崟r(shí)通信

        摘要該文提出了一種在Windows3.1保護(hù)模式下,通過(guò)動(dòng)態(tài)連接庫(kù)(DLL)生成中斷服務(wù)程序代碼,實(shí)現(xiàn)外設(shè)與Windows應(yīng)用程序?qū)崟r(shí)通信的有效方法。

        一、前言
        計(jì)算機(jī)的日益普及和計(jì)算機(jī)技術(shù)日益成熟,使得計(jì)算機(jī)在工業(yè)控制監(jiān)測(cè)中的應(yīng)用漸漸深入。但工業(yè)應(yīng)用不同于其它方面,它要求有較強(qiáng)的實(shí)時(shí)性。現(xiàn)在有很多的DOS軟件在運(yùn)行過(guò)程中通過(guò)掛接外部中斷方式實(shí)現(xiàn)DOS應(yīng)用軟件與外設(shè)的實(shí)時(shí)通信,這種方法實(shí)現(xiàn)起來(lái)十分簡(jiǎn)單。而在Windows中應(yīng)用程序能否也能夠利用外部硬中斷實(shí)現(xiàn)外設(shè)與Windows應(yīng)用程序的實(shí)時(shí)通信呢?答案是肯定的。這里的關(guān)鍵是要解決好中斷代碼與Windows應(yīng)用程序相互之間交換信息的問(wèn)題。
        從外設(shè)發(fā)送異步的硬中斷,通過(guò)中斷處理程序傳遞一條信息給Windows應(yīng)用程序。這時(shí)可以初始化相關(guān)端口,準(zhǔn)備好數(shù)據(jù),然后進(jìn)行數(shù)據(jù)傳送,從而做到實(shí)時(shí)通信。
        實(shí)現(xiàn)Windows應(yīng)用程序響應(yīng)外部中斷的方法有很多,如Microsoft公司自己開(kāi)發(fā)的SDK、DDK軟件包,使用嵌入式匯編等等。本文將介紹一種在BC 3.1的基礎(chǔ)上利用Windows3.1擁有的一些功能實(shí)現(xiàn)Windows實(shí)時(shí)通信的實(shí)例。

        二、中斷代碼的位置
        在Windows中,幾乎所有的異步事件都是由中斷處理程序來(lái)管理的。中斷處理程序包含在設(shè)備驅(qū)動(dòng)程序中,由Windows在環(huán)境初始化中安裝。例如,KEYBOARD.DRV、MOUSE.DRV和COMM.DRV均含有中斷處理程序,以處理相應(yīng)的鍵盤、鼠標(biāo)和串行口的異步中斷。可以仿照標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)程序,編寫中斷處理代碼,以響應(yīng)外設(shè)的通信請(qǐng)求,從而完成一次實(shí)時(shí)通信。
        中斷代碼既可以包含在應(yīng)用程序的可執(zhí)行代碼中,也可以包含在動(dòng)態(tài)連接庫(kù)(DLL)中。包含在應(yīng)用程序中的代碼只能在一個(gè)程序中使用,而在動(dòng)態(tài)連接庫(kù)中的代碼則可以在Windows系統(tǒng)中所有的應(yīng)用程序所共享。這樣不僅在整個(gè)Windows系統(tǒng)中只有一個(gè)中斷代碼的副本,提高了內(nèi)存的使用效率,更重要的是可以防止由于同時(shí)存在多個(gè)中斷代碼的副本而發(fā)生沖突。本文將在DLL中編制中斷處理程序。
        當(dāng)動(dòng)態(tài)連接庫(kù)被裝入時(shí),要調(diào)用DLL庫(kù)的入口點(diǎn)LibMain(),利用這一點(diǎn)可以執(zhí)行一些初始化工作,可以分配一些內(nèi)存塊,可以初始化一些全局變量或者靜態(tài)變量,可以安裝中斷服務(wù)程序的代碼等等。例如:
        voidinterrupt(oldIsr)(--CPPARGS)
        /*舊的中斷服務(wù)程序地址*/
        LibMain(HANDLEhInstance,WORDwDataSeg,WORDcbHeapSize,L
        PSTR
        lpszCmdLine)
        {

        oldIsr=getvect(IRQNum);
        /*IRQNum指中斷號(hào)*/
        setvect(IRQNum,newIsr);
        /*newIsr指新中斷服務(wù)程序代碼*/
        return(1);
        }
        函數(shù)setvect()既可在實(shí)模式下,也可在保護(hù)模式下設(shè)置中斷處理向量。
        上述代碼也可以放在一個(gè)由用戶設(shè)置的引出(export)函數(shù)中,在應(yīng)用程序中用戶可以調(diào)用此引出函數(shù)來(lái)安裝中斷服務(wù)程序代碼。
        由于中斷可以在任何時(shí)刻發(fā)生,中斷代碼必須駐留在內(nèi)存中,并且在應(yīng)用程序運(yùn)行的過(guò)程中一直處于某一固定內(nèi)存中。這一點(diǎn)無(wú)論是在實(shí)模式還是在保護(hù)模式下都是一致的。
        在DLL的模塊定義文件中應(yīng)注意:

        1.CODE語(yǔ)句為固定代碼段,即FIXED;

        2.EXPORTS語(yǔ)句要引出被應(yīng)用程序和其它DLL用作入口點(diǎn)的函數(shù)。

        三、通信機(jī)制
        編寫實(shí)時(shí)通信例程關(guān)鍵在于必須認(rèn)識(shí)到,異步事件對(duì)應(yīng)用程序的觸發(fā)是異步發(fā)生的,不在Windows的消息處理機(jī)制和多任務(wù)范圍內(nèi)。為了使通信例程能夠正確地工作,通信例程必須通知Windows有異步事件發(fā)生,且不能打斷應(yīng)用程序的任務(wù)管理或消息流。要作到這一點(diǎn),通信例程必須通過(guò)調(diào)用PostMessage或PostAppMessage函數(shù)向應(yīng)用程序的消息隊(duì)列中加入一條消息。
        需要注意的是,在DLL中調(diào)用PostMessage(HWNDhwnd,…)時(shí),必須先確定hwnd的實(shí)際值,可以通過(guò)使用引出函數(shù)的辦法來(lái)實(shí)現(xiàn),如下所示:
        staticHWNDhWndApp;
        voidFARPASCALSetIsrWin(HWNDhwnd)
        {
        hWndApp=hwnd;
        }
        然后在應(yīng)用程序的窗口函數(shù)中,對(duì)WM-CREATE消息進(jìn)行處理時(shí)調(diào)用此函數(shù)來(lái)初始化DLL中的靜態(tài)變量hWndApp:
        CASEWM-CREATE:

        SetIsrWin(hwnd);/*hwnd指應(yīng)用程序窗口句柄*/
        定義一個(gè)在應(yīng)用程序中使用的消息:
        #defineISRM-RUPTWM-USER 255最后在DLL中的中斷服務(wù)程序代碼中,調(diào)用PostMessage即可完成Windows應(yīng)用程序和中斷服務(wù)程序代碼相互的信息交流:
        voidinterruptnewIsr(--CPPARGS)
        {

        PostMessage(hWndApp,WM-RUPT,wParam,lParam);

        }

        四、程序?qū)嵗?br>本示例先安裝在DLL中的外中斷服務(wù)代碼,通過(guò)386/AT總線上的中斷申請(qǐng)線(IRQ12)外觸發(fā),由中斷服務(wù)代碼發(fā)送一條消息WM-RUPT通知Windows應(yīng)用程序外設(shè)有實(shí)時(shí)通信請(qǐng)求,應(yīng)用程序收到這條消息后,在窗口用戶區(qū)顯示一條信息,表明已和外設(shè)聯(lián)絡(luò)上,并同時(shí)鳴叫一聲喇叭。
        程序分為兩部分:DLL庫(kù)代碼和Windows應(yīng)用程序代碼。

        1.DLL庫(kù)代碼
        /*----------*
        *interruptincludefile,namedhandle.h*
        *----------*/
        voidFARPASCALSetIsrWin(HWNDhwnd);
        voidFARPASCALSetIRQNum(unsignedcharIRQ);
        /*----------*
        *moduledefinationfile,namedhandle.def*
        *----------*/
        LIBRARYHANDLE
        EXETYPESWINDOWS
        STUB'WINSTUB.EXE'
        CODEPRELOADFIXED
        DATAPRELOADSINGLE
        HEAPSIZE1024
        EXPORTS
        WEP
        @1RESIDENTNAME
        SetIRQNum@3
        /*----------*
        *interruptserviceprogramindll,namedhandle.dll*

        作者:薛立宏史鐵林余佳兵

        【用Borland C 3.1實(shí)現(xiàn)外設(shè)與Windows應(yīng)用程序?qū)崟r(shí)通信】相關(guān)文章:

        VC++實(shí)現(xiàn)串口通信的應(yīng)用程序設(shè)計(jì)03-07

        實(shí)時(shí)混音的實(shí)現(xiàn)03-18

        在Windows2000下用多線程實(shí)現(xiàn)1394串行總線通信03-20

        基于Vxworks實(shí)時(shí)操作系統(tǒng)的串口通信程序設(shè)計(jì)與實(shí)現(xiàn)03-18

        用Windows終端仿真程序?qū)崿F(xiàn)微機(jī)遠(yuǎn)程文件傳送03-18

        在Windows系統(tǒng)中用VC 實(shí)現(xiàn)鉤子機(jī)制03-18

        用EP7211實(shí)現(xiàn)傳呼信息實(shí)時(shí)語(yǔ)音合成和播放03-19

        TMS320C54XX系列DSP與PC機(jī)間串行通信的實(shí)現(xiàn)03-18

        ADμC812的串行外設(shè)接口(SPI)及其應(yīng)用03-18

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 亚洲九九影院在线 | 一本大道香蕉大在线日韩 | 一级特级欧美aⅴ在线 | 午夜激情视频国产 | 中文字幕久久35一 | 亚洲综合中文字幕在线 |