很少看到有資料寫如何以中斷的方式發(fā)送一幀數(shù)據(jù),如果以等待的發(fā)送數(shù)據(jù)幀,對高速運行的單片機來說是很浪費時間的,下面就介紹一種使用中斷方式發(fā)送數(shù)據(jù)幀,操作平臺采用51 mcu
首先定義一個數(shù)據(jù)幀的結(jié)構(gòu)體,該結(jié)構(gòu)體可以做為一個全局變量,所有的發(fā)送都要經(jīng)過這個結(jié)構(gòu)體:
//結(jié)構(gòu)體
struct{
charbusy_falg;//忙標(biāo)志,若在發(fā)送數(shù)據(jù)時置位1,即在開始發(fā)送置位1,發(fā)送結(jié)束置位0
intindex;//索引,指向需要發(fā)送數(shù)組的位置
intlength;//整個數(shù)據(jù)幀的長度
char*buf;//指向需要發(fā)送的數(shù)據(jù)幀,建議為全局變量,否則一旦開始發(fā)送,必須等到發(fā)送結(jié)束,即判斷busy_falg為0
}send_buf;
發(fā)送數(shù)據(jù)的函數(shù),這里有個缺點,就是還是要使用while來檢測串口是否忙碌,不過這樣比占用系統(tǒng)時間來發(fā)送要好的多了:
//發(fā)送一幀
voidSendBuf(char*buf,intlength)
{
while(busy_falg);//查詢發(fā)送是否忙,否則循環(huán)等待
send_buf.length=length;
send_buf.index=0;
send_buf.buf=buf;
send_buf.busy_falg=1;
SBUF=send_buf.buf[0];//寫入SBUF,開始發(fā)送,后面就自動進(jìn)入中斷發(fā)送
}
串口中斷發(fā)送函數(shù),注意設(shè)置空閑標(biāo)志位,避免多任務(wù)時多個發(fā)送幀調(diào)用了同一個結(jié)構(gòu)體:
voidSerialInt()interrupt4//串口中斷
{
if(RI==1)//串口接收
{
RI=0;
}
elseif(TI==1)//串口發(fā)送
{
TI=0;
send_buf.index++;
if(send_buf.index==send_buf.length)
{
send_buf.busy_falg=0;//發(fā)送結(jié)束
return;
}
SBUF=send_buf.buf[send_buf.index];//繼續(xù)發(fā)送下一個
}
}
串口中斷發(fā)送就是這樣簡單,注意busy_falg和index的使用。
-
單片機
+關(guān)注
關(guān)注
6064文章
44934瀏覽量
647550 -
數(shù)據(jù)幀
+關(guān)注
關(guān)注
0文章
49瀏覽量
6919
發(fā)布評論請先 登錄
51單片機什么情況下會產(chǎn)生串口中斷
串口中斷丟失數(shù)據(jù)問題
51單片機進(jìn)行串口通信的發(fā)送與接收的實例程序免費下載

使用單片機的串口發(fā)送數(shù)據(jù)幀的程序免費下載

如何使用51單片機進(jìn)行串口通信的發(fā)送與接收

使用51單片機的中斷方式實現(xiàn)串口數(shù)據(jù)發(fā)送與接收的程序免費下載

使用51單片機進(jìn)行接收和發(fā)送的串口通信資料免費下載

51單片機串口中斷功能的設(shè)置

51單片機串行口中斷的使用(指針)

串口傳輸(51單片機版)

評論