天天看點

keil中printf的有關問題

在keil中printf 預設是向序列槽中發送資料的,是以,如果應用該函數,必須先初始化序列槽,否則可能引起當機的情況,并且在printf之前應該先将TI置位,摘抄原因如下:

1.printf函數是調用putchar函數輸入的,而putchar應該是先判斷ti是否為1,不為1則等待為1。 如果為1則清0,然後送出一個字元。是以 你如果直接使用printf函數,你的程式就會在putchar函數中等待ti為1。這時你的程式就相當于直接死掉了。你可以通過改寫putchar函數 實作自己的目的。TI相當于是初始化~不給賦初值就不幹活

2.Keil的序列槽處理比較巧妙的,我的分析如下:

   putchar.c裡面,是先檢測TI再發送。這樣做的目的是把盡可能多的時間留給2次序列槽操作之間的程式,而不是把等待位元組發送的時間白白空等待浪費 掉。是以,在系統初始化的時候,一定要令TI=1; 就可以順暢的使用printf函數了。摟主sbuf=" "的辦法,其實就是令TI=1.   另外要特别注意,printf函數執行完畢後,最後一個位元組并未發送完畢,例如在485通訊中,此時如果切換為收模式,會丢失最後一位元組.

3.一般序列槽發送都是等TI(位元組發送完标志)為1就馬上發送下一位元組,由于不管是中斷還是查 詢TI标志的方法,都會檢測TI,是以首次發送必須置位TI标志,使序列槽開始發送你的“在程式的初始化部分往序列槽資料寄存器SBUF裡放一個字元來起用終 端顯示;”方法最終作用也就是把TI置1,改成TI=1;來啟動發送也是一樣的(當然,不會發出那個' '字元了)。

4.<stdio.h>中定義,調用底層的putchar()來實作.底層發送數 據到序列槽時,先查TI=1是否成立,死等直到TI=1時将新資料寫入SBUF,函數傳回,是以要先将TI置1,啟動第一次傳輸操作.可檢視反彙編相關代碼 了解其工作機理!

5.自己了解:在多機通訊中,應該也要形成像 putchar()函數的機理,要有序列槽中斷服務程式,并且是在該程式中判斷TI,根據TI是不是該發送下一組資料~同樣對于接收的一方..

原諒連接配接: http://hi.baidu.com/zsb7739/blog/item/35385417898a8f4021a4e91c.html/cmtid/7adc563