很少看到有資料寫如何以中斷的方式發送一幀數據,如果以等待的發送數據幀,對高速運行的單片機來說是很浪費時間的,下面就介紹一種使用中斷方式發送數據幀,操作平臺采用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的使用。
-
單片機
+關注
關注
6035文章
44554瀏覽量
634641 -
數據幀
+關注
關注
0文章
45瀏覽量
6739
發布評論請先 登錄
相關推薦
評論