新聞中心

        EEPW首頁 > 測試測量 > 設計應用 > 單片機監控程序的實現

        單片機監控程序的實現

        ——
        作者:柯 鋒 周永鵬 黃錦恩 時間:2006-07-22 來源: 收藏
          

        摘 要 首先分析了(80C196為例)監控程序的實現;介紹了在Win98平臺使用實現,以及如何利用將匯編后的二進制用戶程序發送至執行。 
        關鍵詞     
        1 引 言
          在調試單片機應用系統時,需要反復地修改用戶程序,為了避免頻繁地使用編程器寫存儲芯片,可以編制單片機監控程序,單片機的監控程序接收來自PC機的用戶程序,PC機向單片機發送用戶程序。
        2 用戶程序格式
          用戶將單片機源程序(.asm文件)匯編后形成.hex格式的文件,該文件即為發送至單片機的十六進制可執行文件。該文件的結構是:由多行構成,行頭為起始符(:),然后是該行有效數據字節數(滿行時該數為10,即十進數16),接下來為兩字節地址及00,接著是有效數據,行尾是校驗碼及換行符。為了簡化單片機監控程序,僅向單片機發送行字節數和有效數據,可用下面的簡單C語句從.hex文件中提取字節數和有效數據:
          fscanf(fp,":%2x%4x00",&TranBytes,&Address);
          fscanf(fp,"%2x",&TranChar);
        3 單片機監控程序的實現
          單片機監控程序實現的功能為:接收來自PC機的用戶程序,將用戶程序放置在用戶程序段,當用戶程序接收完畢后,跳轉至用戶程序段首地址以執行用戶程序。接收采用單字節方式,即每次只接收一個字節。
            為了保證單片機接收用戶程序的準確性,在接收用戶程序之前需要進行握手。筆者所用的握手協議為:PC機發0x55,單片機收0x55后發回0x55給PC機,上位PC機收0x55后再發0xaa,單片機收0xaa后發回,PC機收0xaa后握手成功,轉為發用戶程序,單片機轉為接收用戶程序。
          為了防止單片機監控程序被破壞,需將其固化在EPROM里。筆者所用的80C196系統,將地址2000H-7FFFFH固化,監控程序從2080開始。這樣一來又涉及到如何使用中斷向量的問題。可以這樣解決:在中斷向量地址中放入8000之后的地址,舉例說明,在串行中斷向量地址放入8030H,當要使用串行中斷時,在8030中PUSHF和LJMP指令,在8032中放入跳轉字節數。
          利用串行中斷,單片機接收用戶程序為逐行接收(見前敘.hex文件的結構)。先接收本行要接收的字節個數,然后才將接受的有效數據寫入用戶程序段,當接受的有效數據數等于該行要接收的字節個數時,準備接收下一行,如此反復,如果某行要接收的字節數為0,則表明用戶程序已經傳完,將用戶程序段首址壓入堆棧再彈出(改變中斷返回地址技術),以執行用戶程序,如圖1所示。




        4 Win98平臺串行通信的實現
          現在PC機的應用程序絕大多數都是基于Win98,在進行串行通信時可以通過調用來實現。提供了對串口的各種操作。串口通信時通過CreateFile,GetCommState,SetCommState,WriteFile,ReadFile,CloseHandle以及超時函數GetCommTimeouts,SetCommTimeouts來實現。利用CreateFile函數打開串口,獲取串口句柄,CloseHandle關閉串口句柄,利用GetComm-State和SetCommState對通信參數進行設置,WriteFile及ReadFile可對串口進行讀寫。在TC環境下,對串口的操作方式有兩種:查詢方式和中斷方式。在VC環境下,對串口的操作方式可有多種:查詢方式,同步I/O方式,異步I/O方式,以及事件驅動I/O方式。筆者采用的是異步I/O方式,它可以讓串口操作在后臺執行。讓讀寫串口操作有足夠的時間在后臺執行。使用異步I/O方式時,采用如下方式打開串口:
          HANDLE m_hCom=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
          FILE_FLAG_OVERLAPPED指明串口為異步方式打開。此時可以分別在WriteFile和ReadFile的最后一個參數中指定一個OVERLAPPED結構,如下所示:
            OVERLAPPED m_OverlappedWrite,     
          m_OverLappedRead;
          m_OverlappedWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
          m_OverlappedRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
            CreateEvent函數創建一個有名或無名的事件對象,第一個參數為保密屬性,設為NULL,第二個參數為TRUE,指明要用ResetEvent函數將事件設為無信號,若為FALSE,則在一個等待該事件的線程被釋放后系統自動將其設置為無信號,第三個參數設事件初始為無信號,第四個參數設事件名為NULL。在讀寫操作中使用事件:
          WriteFile(m_hCom,&WriteBuffer,nByteToWrite,&nByteWritten,&m_OverlappedWrite)

          ReadFile(m_hCom,&ReadBuffer,nByteToRead,&nByteRead,&m_OverlappedRead) 
          當WriteFile接手控制時m_OverlappedWrite.hEvent為無信號,讀操作完成后,m_OverlappedWrite.hEvent變為發信號狀態,寫操作完成類似。在使用ReadFile和WriteFile對串口進行讀寫時需要注意的是,這兩個函數均為立即返回型函數,亦即,可能在實際的讀寫操作還沒有完成時函數就返回,操作轉入后臺,但這并不表明實際的操作失敗。如果返回錯誤代碼為ERROR_IO_PENDING(通過調用GetLastError獲取),說明讀寫操作仍在進行,這時事件仍然為無信號,為了顯式地限定前臺等待操作的時間,可以進行延時處理,調用GetTickCount,GetTickCount()函數獲取系統當前時間,類似于C中的biostime()函數。可以通過調用GetOverlappedResult獲取后臺的操作情況,該函數報告最近一次OVERLAPPED操作的結果,函數原型如下: 
            BOOLGetOverlappedResult(
            HANDLEhFile,     //文件句柄 

            LPOVERLAPPEDlpOverlapped,
                           //OVERLAPPED結構指針

            LPDWORD lpNumberOfBytesTransferred, 

                           //實際完成的字節數

            BOOLbWait

                           //等待標志 );
            在進行串口讀寫時,hFile為串口句柄,lpOverlapped是該函數等待的事件,lpNumberOfBytesTransferrd為實際讀寫完成的字節數,當bWait為TRUE時,該函數等待讀寫操作完成后返回,bWait為FALSE時函數立即返回。關于以上兩個函數的使用,參看如下程序代碼:
        if(!WriteFile(m_hCom,&WriteBuffer,nByteToWrite,&nByteWritten,&m_OverlappedWrite)){

        if(GetLastError()==ERROR_IO_PENDING) 


            endtime=GetTickCount()+1000; //延時1000 ms  
            while(!GetOverlappedResult(m_hCom,&m_OverlappedWrite&nByteWritten,FALSE)) 

        { 

           if(GetTickCount()>endtime) break;

          }

         } 
        if(nByteWritten)    
             //處理所讀的字節

         }
          函數ReadFile的調用可以類似地處理,進行延時處理后,就可以等到讀寫操作完成之后再執行后續程序。為了應用的方便,可以通過調用API函數,編寫自己的串口操作類庫來完成實際的需要。
        5 結 語


          本文介紹的單片機監控程序及串行通信方法簡單,易于實現,程序運行穩定。


        參 考 文 獻


        1 汪建,孫開放,章述漢.MCS-96系列單片機原理及應用技術.武昌:華中理工大學出版社,1999
        2 Peter Norton,Rob McGregor.MFC開發Windows95/NT4應用程序.北京:清華大學出版社,1998
        3 譚浩強.C程序設計.北京:清華大學出版社,1998 

         


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 广东省| 柳林县| 洪湖市| 青龙| 闸北区| 汶上县| 徐汇区| 陇川县| 淳安县| 遂宁市| 铁岭县| 清镇市| 南投市| 白沙| 阜南县| 永嘉县| 梁山县| 长宁县| 甘肃省| 陇川县| 拜城县| 祁连县| 自治县| 习水县| 南溪县| 上饶市| 漳平市| 抚宁县| 西乡县| 西林县| 乌拉特后旗| 高阳县| 当雄县| 鸡东县| 元江| 凤阳县| 保山市| 鄂尔多斯市| 仁怀市| 磐石市| 云安县|