很少看到有資料寫如何以中斷的方式發(fā)送一幀數(shù)據(jù),如果以等待的發(fā)送數(shù)據(jù)幀,對高速運(yùn)行的單片機(jī)來說是很浪費(fèi)時(shí)間的,下面就介紹一種使用中斷方式發(fā)送數(shù)據(jù)幀,操作平臺采用51 mcu
首先定義一個(gè)數(shù)據(jù)幀的結(jié)構(gòu)體,該結(jié)構(gòu)體可以做為一個(gè)全局變量,所有的發(fā)送都要經(jīng)過這個(gè)結(jié)構(gòu)體:
//結(jié)構(gòu)體
struct{
charbusy_falg;//忙標(biāo)志,若在發(fā)送數(shù)據(jù)時(shí)置位1,即在開始發(fā)送置位1,發(fā)送結(jié)束置位0
intindex;//索引,指向需要發(fā)送數(shù)組的位置
intlength;//整個(gè)數(shù)據(jù)幀的長度
char*buf;//指向需要發(fā)送的數(shù)據(jù)幀,建議為全局變量,否則一旦開始發(fā)送,必須等到發(fā)送結(jié)束,即判斷busy_falg為0
}send_buf;
發(fā)送數(shù)據(jù)的函數(shù),這里有個(gè)缺點(diǎn),就是還是要使用while來檢測串口是否忙碌,不過這樣比占用系統(tǒng)時(shí)間來發(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ù)時(shí)多個(gè)發(fā)送幀調(diào)用了同一個(gè)結(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ā)送下一個(gè)
}
}
串口中斷發(fā)送就是這樣簡單,注意busy_falg和index的使用。
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634629 -
數(shù)據(jù)幀
+關(guān)注
關(guān)注
0文章
45瀏覽量
6739
發(fā)布評論請先 登錄
相關(guān)推薦
評論