當前位置:首頁 > 單片機 > 單片機
[導讀]1 引 言在調試單片機應用系統(tǒng)時,需要反復地修改用戶程序,為了避免頻繁地使用編程器寫存儲芯片,可以編制單片機監(jiān)控程序,單片機的監(jiān)控程序接收來自PC機的用戶程序,PC機向單片機發(fā)送用戶程序。2 用戶程序格式用

1 引 言

在調試單片機應用系統(tǒng)時,需要反復地修改用戶程序,為了避免頻繁地使用編程器寫存儲芯片,可以編制單片機監(jiān)控程序,單片機的監(jiān)控程序接收來自PC機的用戶程序,PC機向單片機發(fā)送用戶程序。

2 用戶程序格式

用戶將單片機源程序(.asm文件)匯編后形成.hex格式的文件,該文件即為發(fā)送至單片機的十六進制可執(zhí)行文件。該文件的結構是:由多行構成,行頭為起始符(:),然后是該行有效數(shù)據(jù)字節(jié)數(shù)(滿行時該數(shù)為10,即十進數(shù)16),接下來為兩字節(jié)地址及00,接著是有效數(shù)據(jù),行尾是校驗碼及換行符。為了簡化單片機監(jiān)控程序,僅向單片機發(fā)送行字節(jié)數(shù)和有效數(shù)據(jù),可用下面的簡單C語句從.hex文件中提取字節(jié)數(shù)和有效數(shù)據(jù):
  fscanf(fp,":%2x%4x00",&TranBytes,&Address);
  fscanf(fp,"%2x",&TranChar);

3 單片機監(jiān)控程序的實現(xiàn)

單片機監(jiān)控程序實現(xiàn)的功能為:接收來自PC機的用戶程序,將用戶程序放置在用戶程序段,當用戶程序接收完畢后,跳轉至用戶程序段首地址以執(zhí)行用戶程序。接收采用單字節(jié)方式,即每次只接收一個字節(jié)。

為了保證單片機接收用戶程序的準確性,在接收用戶程序之前需要進行握手。筆者所用的握手協(xié)議為:PC機發(fā)0x55,單片機收0x55后發(fā)回0x55給PC 機,上位PC機收0x55后再發(fā)0xaa,單片機收0xaa后發(fā)回,PC機收0xaa后握手成功,轉為發(fā)用戶程序,單片機轉為接收用戶程序。

為了防止單片機監(jiān)控程序被破壞,需將其固化在EPROM里。筆者所用的80C196系統(tǒng),將地址2000H-7FFFFH固化,監(jiān)控程序從2080開始。這樣一來又涉及到如何使用中斷向量的問題??梢赃@樣解決:在中斷向量地址中放入8000之后的地址,舉例說明,在串行中斷向量地址放入8030H,當要使用串行中斷時,在8030中PUSHF和LJMP指令,在8032中放入跳轉字節(jié)數(shù)。

利用串行中斷,單片機接收用戶程序為逐行接收(見前敘.hex文件的結構)。先接收本行要接收的字節(jié)個數(shù),然后才將接受的有效數(shù)據(jù)寫入用戶程序段,當接受的有效數(shù)據(jù)數(shù)等于該行要接收的字節(jié)個數(shù)時,準備接收下一行,如此反復,如果某行要接收的字節(jié)數(shù)為0,則表明用戶程序已經傳完,將用戶程序段首址壓入堆棧再彈出(改變中斷返回地址技術),以執(zhí)行用戶程序,如圖1所示。

4 Win98平臺串行通信的實現(xiàn)

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

當WriteFile接手控制時m_OverlappedWrite.hEvent為無信號,讀操作完成后,m_OverlappedWrite. hEvent變?yōu)榘l(fā)信號狀態(tài),寫操作完成類似。在使用ReadFile和WriteFile對串口進行讀寫時需要注意的是,這兩個函數(shù)均為立即返回型函數(shù),亦即,可能在實際的讀寫操作還沒有完成時函數(shù)就返回,操作轉入后臺,但這并不表明實際的操作失敗。如果返回錯誤代碼為ERROR_IO_PENDING (通過調用GetLastError獲?。f明讀寫操作仍在進行,這時事件仍然為無信號,為了顯式地限定前臺等待操作的時間,可以進行延時處理,調用 GetTickCount,GetTickCount()函數(shù)獲取系統(tǒng)當前時間,類似于C中的biostime()函數(shù)。可以通過調用 GetOverlappedResult獲取后臺的操作情況,該函數(shù)報告最近一次OVERLAPPED操作的結果,函數(shù)原型如下: 
    BOOLGetOverlappedResult(
    HANDLEhFile,     //文件句柄
    LPOVERLAPPEDlpOverlapped,
                   //OVERLAPPED結構指針
    LPDWORD lpNumberOfBytesTransferred, 
                   //實際完成的字節(jié)數(shù)
    BOOLbWait
                   //等待標志?。?;

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

    endtime=GetTickCount()+1000;?。訒r1000 ms  
    while(!GetOverlappedResult(m_hCom,&m_OverlappedWrite&nByteWritten,F(xiàn)ALSE)) 
{ 
   if(GetTickCount()>endtime) break;
  }
 } 
if(nByteWritten)    
    ?。幚硭x的字節(jié)
 }

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

5 結 語

本文介紹的單片機監(jiān)控程序及串行通信方法簡單,易于實現(xiàn),程序運行穩(wěn)定。

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

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉