單片機串口發(fā)送數(shù)據(jù)幀
出處:eefocus 發(fā)布于:2018-06-02 14:49:15
很少看到有資料寫如何以中斷的方式發(fā)送一幀數(shù)據(jù),如果以等待的發(fā)送數(shù)據(jù)幀,對高速運行的單片機來說是很浪費時間的,下面就介紹一種使用中斷方式發(fā)送數(shù)據(jù)幀,操作平臺采用51 mcu
首先定義一個數(shù)據(jù)幀的結構體,該結構體可以做為一個全局變量,所有的發(fā)送都要經(jīng)過這個結構體:
//結構體
struct {
char busy_falg;//忙標志,若在發(fā)送數(shù)據(jù)時置位1,即在開始發(fā)送置位1,發(fā)送結束置位0
int index;//索引,指向需要發(fā)送數(shù)組的位置
int length;//整個數(shù)據(jù)幀的長度
char *buf;//指向需要發(fā)送的數(shù)據(jù)幀,建議為全局變量,否則一旦開始發(fā)送,必須等到發(fā)送結束,即判斷busy_falg為0
} send_buf;
發(fā)送數(shù)據(jù)的函數(shù),這里有個缺點,就是還是要使用while來檢測串口是否忙碌,不過這樣比占用系統(tǒng)時間來發(fā)送要好的多了:
//發(fā)送一幀
void SendBuf(char *buf,int length)
{
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ā)送,后面就自動進入中斷發(fā)送
}
串口中斷發(fā)送函數(shù),注意設置空閑標志位,避免多任務時多個發(fā)送幀調(diào)用了同一個結構體:
void SerialInt() interrupt 4 //串口中斷
{
if(RI == 1) //串口接收
{
RI = 0;
}
else if(TI == 1)//串口發(fā)送
{
TI = 0;
send_buf.index++;
if(send_buf.index == send_buf.length)
{
send_buf.busy_falg = 0;//發(fā)送結束
return;
}
SBUF = send_buf.buf[send_buf.index];//繼續(xù)發(fā)送下一個
}
}
串口中斷發(fā)送就是這樣簡單,注意busy_falg和index的使用。
版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- 單片機技術特性與嵌入式開發(fā)實踐指南2026/1/7 10:00:02
- 單片機(MCU)與數(shù)字信號處理器(DSP)分類及選型技術指南2025/12/30 10:02:37
- 工業(yè)級DSP信號處理系統(tǒng):硬件適配與抗干擾工程方案2025/12/15 14:41:00
- HOLTEK推出HT32F65533G/733G內(nèi)建N/N預驅(qū)電機專用SoC單片機2025/11/26 14:11:41
- 什么是C51數(shù)據(jù)類型擴充定義2025/10/27 13:59:22









