標(biāo)題:
單片機串口發(fā)送數(shù)據(jù)為什么要先關(guān)串口中斷?發(fā)送數(shù)據(jù)與字符串有什么區(qū)別?
[打印本頁]
作者:
不想12453
時間:
2018-5-10 10:03
標(biāo)題:
單片機串口發(fā)送數(shù)據(jù)為什么要先關(guān)串口中斷?發(fā)送數(shù)據(jù)與字符串有什么區(qū)別?
第一個是單片機串口發(fā)送數(shù)據(jù)的程序 可是為什么需要先關(guān)串口中斷?發(fā)送完數(shù)據(jù)再開串口中斷呢??還有。!發(fā)送串口數(shù)據(jù)與發(fā)送字符串有什么區(qū)別呢?
單片機源碼:
/*----------------------------
UART1 發(fā)送串口數(shù)據(jù)
-----------------------------*/
void UART1_SendData(uchar dat)
{
ES=0; //關(guān)串口中斷
SBUF=dat; //將數(shù)據(jù)放入發(fā)送數(shù)據(jù)緩沖器中
while(TI!=1); //等待發(fā)送成功 TI=1時表示一幀數(shù)據(jù)發(fā)送成功,要求CPU取走SBUF里的數(shù)據(jù)
TI=0; //清除發(fā)送中斷標(biāo)志 TI必須軟件清零
ES=1; //開串口中斷
}
/*----------------------------
UART1 發(fā)送字符串
-----------------------------*/
void UART1_SendString(char *s)
{
while(*s)//檢測字符串結(jié)束符
{
UART1_SendData(*s++);//發(fā)送當(dāng)前字符
}
}
復(fù)制代碼
作者:
liunian17
時間:
2018-5-10 11:00
我知道的是,不需要關(guān)閉中斷的,中斷是為了接受數(shù)據(jù)而不是發(fā)送數(shù)據(jù)的。
發(fā)送數(shù)據(jù)和發(fā)送字符串是一樣的,字符串就是數(shù)據(jù)。只是發(fā)送只能一個一個字符去發(fā),所以發(fā)送字符串要拆開來一個一個字符發(fā)
作者:
wulin
時間:
2018-5-10 11:27
1.串口發(fā)送數(shù)據(jù)時不能被接收中斷干擾,所以要關(guān)閉串口接收中斷。
2.串口發(fā)送程序一次只能發(fā)送一個字節(jié),如果要發(fā)送字符串,就要反復(fù)調(diào)用發(fā)送程序,直到發(fā)送完畢。
作者:
top_行癲
時間:
2018-5-10 12:07
關(guān)串口中斷只是一種嚴(yán)謹(jǐn)?shù)姆绞,其實不關(guān)你的程序應(yīng)該也可以。其次字符串的發(fā)送跟字節(jié)本質(zhì)上是一樣的,只不過是將字符串按一個個字節(jié)連續(xù)發(fā)送而已
作者:
guo6339419
時間:
2018-5-10 15:02
是怕發(fā)送的過程中被接收中斷打斷吧
作者:
zfgansuchina
時間:
2018-5-10 16:52
發(fā)送串口數(shù)據(jù)是指發(fā)送一個字節(jié),每個字符是2個字節(jié),因此發(fā)送字符串其實是發(fā)送2*n個字節(jié)
作者:
yzwzfyz
時間:
2018-5-10 18:37
不知道是哪個高手老師教一招!
我是這樣做的:
1、將要發(fā)的數(shù)據(jù)統(tǒng)統(tǒng)放在一個緩沖區(qū)中,假設(shè)有N個字節(jié)。
2、打開中斷
3、發(fā)一個字節(jié),發(fā)完后就干別的事了!之后,當(dāng)這個字節(jié)發(fā)完后就產(chǎn)生了中斷。
4、在發(fā)送中斷處理程序中,判斷一下是否N個字節(jié)是否全發(fā)完了,未完就續(xù)發(fā)下一個字節(jié),退出中斷服務(wù)程序。
5、退出后,又干別的事了!再之后,這個字節(jié)發(fā)完后就產(chǎn)生了中斷。
……4-5-4-5-4-5-……
自打開機初始化后,就沒有關(guān)過串口中斷!!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1