[問題] 改寫UART程式 ,不使用while等待

作者: kingzero (一起迷路)   2014-08-08 12:25:12
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Ansi C
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
MCU 自訂的函數
問題(Question):
不想使用while在那裏不斷地等待,占用CPU的時間.
那段時間可以執行近萬行指令.
餵入的資料(Input):
同樣的參數
預期的正確結果(Expected Output):
同樣的結果
錯誤結果(Wrong Output):
現在測試出的結果有
1.程式亂飛(PC亂了)
2.不斷地持續傳送
程式碼(Code):(請善用置底文網頁, 記得排版)
好讀版
http://ideone.com/dz4HER
void UART1WriteString( char *string)
{
// P_Debug_O=1;
while(*string != '\0')
{
while(!UARTTransmitterIsReady(UART_MODULE_ID))
;
UARTSendDataByte(UART_MODULE_ID, *string);
string++;
while(!UARTTransmissionHasCompleted(UART_MODULE_ID))
;
}
// P_Debug_O=0;
}
補充說明(Supplement):
我試過下面這一種寫法還是不行
IO_FLAG是自己訂的Union,用來作流程控制的.
void UART1Trans_fail( void)
{
P_Debug_O=1;
if(UARTTransmitterIsReady(UART_MODULE_ID))
{
UARTSendDataByte(UART_MODULE_ID, U1TX_Buffer[U1TX_Index]);
// IO_FLAG.U1TXP=1; //Uart1 TX in processing flag hand up
IO_FLAG.U1TXReady=0;
}
// P_Debug_O=0;
if(UARTTransmissionHasCompleted(UART_MODULE_ID))
{
// IO_FLAG.U1TXP=0;
if(U1TX_CNT==0) //check need to send next byte
{
IO_FLAG.U1TXReady=1;
IO_FLAG.U1TXP=0;
}
U1TX_CNT
作者: damody (天亮damody)   2014-08-08 13:21:00
怎麼不用事件,應該有大部份的chip都有支援吧?看你的chip是哪顆copy範例程式就對了。
作者: askacis (ASKA)   2014-08-08 14:21:00
看他硬體IP完成收送時會不會發中斷,改成用中斷處理不然就是資料出去之後啟動timer去看狀態
作者: wuliou (wuliou)   2014-08-08 20:32:00
通常MCU中斷都是有一個特殊的函數名 去實作它就好了不過我也碰過廠商範例寫超爛的 最後寄信到更上層的原廠才拿到詳細的API文件可以用 不然真的寫到吐血
作者: asdrtyjkl925 (阿斯拉)   2014-08-09 00:58:00
你用的是哪一款MCU ?
作者: timestoprun (憂鬱米蟲)   2014-08-09 01:25:00
MCU型號說一下!!應該就有一堆SampleCode了
作者: jimmytzeng (jimmytseng)   2014-08-10 20:27:00
使用interrupt才是最佳解
作者: iolsolo (ゲッター ビーム!!!)   2014-08-12 02:17:00
廠商的SampleCode本來就只是讓你測試這個功能是能WORK的實際CASE的使用 尤其是interrupt跟Multitask之類的應用就是coding的功夫了

Links booklink

Contact Us: admin [ a t ] ucptt.com