單片機串口發送數據幀


寫了個串口通訊的小例子,點擊右側鏈接查看 https://github.com/PuGongYing1/SerialPort

 

很少看到有資料寫如何以中斷的方式發送一幀數據,如果以等待的發送數據幀,對高速運行的單片機來說是很浪費時間的,下面就介紹一種使用中斷方式發送數據幀,操作平台采用51 mcu

首先定義一個數據幀的結構體,該結構體可以做為一個全局變量,所有的發送都要經過這個結構體:

//結構體
struct {
        char busy_falg;//忙標志,若在發送數據時置位1,即在開始發送置位1,發送結束置位0
        int index;//索引,指向需要發送數組的位置
        int length;//整個數據幀的長度
        char *buf;//指向需要發送的數據幀,建議為全局變量,否則一旦開始發送,必須等到發送結束,即判斷busy_falg為0
} send_buf;發送數據的函數,這里有個缺點,就是還是要使用while來檢測串口是否忙碌,不過這樣比占用系統時間來發送要好的多了:

//發送一幀
void SendBuf(char *buf,int length)
{
        while(busy_falg);//查詢發送是否忙,否則循環等待
        send_buf.length = length;
        send_buf.index = 0;        
        send_buf.buf = buf;
        send_buf.busy_falg = 1;
        SBUF = send_buf.buf[0];//寫入SBUF,開始發送,后面就自動進入中斷發送
}串口中斷發送函數,注意設置空閑標志位,避免多任務時多個發送幀調用了同一個結構體:

void SerialInt() interrupt 4     //串口中斷

    if(RI == 1)  //串口接收
    { 
        RI = 0; 
    } 
        else if(TI == 1)//串口發送
        {
                TI = 0;
                send_buf.index++;
                if(send_buf.index == send_buf.length)
                {
                        send_buf.busy_falg = 0;//發送結束
                        return;
                }
                SBUF = send_buf.buf[send_buf.index];//繼續發送下一個
        }
         
}
串口中斷發送就是這樣簡單,注意busy_falg和index的使用。

From <http://m.blog.csdn.net/liucheng5037/article/details/48831993>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM