很少看到有資料寫如何以中斷的方式發送一幀數據,如果以等待的發送數據幀,對高速運行的單片機來說是很浪費時間的,下面就介紹一種使用中斷方式發送數據幀,操作平臺采用51 mcu
首先定義一個數據幀的結構體,該結構體可以做為一個全局變量,所有的發送都要經過這個結構體:
//結構體
struct{
charbusy_falg;//忙標志,若在發送數據時置位1,即在開始發送置位1,發送結束置位0
intindex;//索引,指向需要發送數組的位置
intlength;//整個數據幀的長度
char*buf;//指向需要發送的數據幀,建議為全局變量,否則一旦開始發送,必須等到發送結束,即判斷busy_falg為0
}send_buf;
發送數據的函數,這里有個缺點,就是還是要使用while來檢測串口是否忙碌,不過這樣比占用系統時間來發送要好的多了:
//發送一幀
voidSendBuf(char*buf,intlength)
{
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,開始發送,后面就自動進入中斷發送
}
串口中斷發送函數,注意設置空閑標志位,避免多任務時多個發送幀調用了同一個結構體:
voidSerialInt()interrupt4//串口中斷
{
if(RI==1)//串口接收
{
RI=0;
}
elseif(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的使用。
-
單片機
+關注
關注
6044文章
44624瀏覽量
638942 -
數據幀
+關注
關注
0文章
47瀏覽量
6800
發布評論請先 登錄
相關推薦
51單片機什么情況下會產生串口中斷
使用51單片機進行接收和發送的串口通信資料免費下載
![使用<b class='flag-5'>51</b><b class='flag-5'>單片機</b>進行接收和<b class='flag-5'>發送</b>的<b class='flag-5'>串口</b>通信資料免費下載](https://file.elecfans.com/web1/M00/9A/2D/pIYBAF0cVqOATIMqAAcUnIaFnyQ445.png)
51單片機串口中斷功能的設置
![<b class='flag-5'>51</b><b class='flag-5'>單片機</b><b class='flag-5'>串口中斷</b>功能的設置](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論