標題:
51單片機串口中斷函數中SBUF的值能存在多久?
[打印本頁]
作者:
13681878016
時間:
2020-5-8 07:29
標題:
51單片機串口中斷函數中SBUF的值能存在多久?
如題,請問51單片機接收數據的SBUF能存活多久呢? 比如下面這個串口中斷復函函數(片段),我將接收中斷標志RI清0之后,SBUF的值多久會消失呢?
unsigned char data = 0;
void Uartinterrpt(void) interrupt 4
{
if(RI == 1)
{
RI = 0;
// 假設這里過很久我才把SBUF接收的值拿出來, 使用delay ();
data = SBUF;
}
}
另外如果發(fā)送函數如下,SBUF拿發(fā)送值的時候 SBUF = c; 恰巧有接收數據被中斷了,執(zhí)行串口中斷函數了,那么SBUF拿的值會不全(比如8位整個字節(jié)拿不全,拿了3位),造成發(fā)送亂碼嗎?
void SendByte(unsigned char c)
{
SBUF = c;
while(TI==0);
TI = 0;
}
作者:
f556
時間:
2020-5-8 09:26
SBUF在下一次串口中斷來之前是不變的,但中斷內不應加延時,并且要盡快取走數據為好。
作者:
xxpp2011
時間:
2020-5-8 09:42
SBUF是特殊寄存器,只要不寫入新的數據就不會消失,寫入新的數據就會覆蓋之前的,單片機復位后初始值為不確定值。
中斷處理完后會回到中斷點繼續(xù)執(zhí)行,不存在接收到一半就發(fā)送出去。另外8位單片機賦值寫入8bit數據應該是同時進行的,應該不會傳到一部分就進入中斷。
作者:
wulin
時間:
2020-5-8 10:30
51單片機的串行口緩沖寄存器(SBUF)的地址是99H,實際是2個緩沖器,寫SBUF的操作完成待發(fā)送數據的加載,讀SBUF的操作可獲得已接收到的數據。兩個操作分別對應兩個不同的寄存器,1個是只寫寄存器,1個是只讀寄存器。
SBUF中的數據在不被新數據覆蓋和不斷電的情況下永久不變,也不會因為被讀取而消失。CPU是通過并行總線讀取寄存器,是一次讀取8位即1個字節(jié),不存在“8位整個字節(jié)拿不全”的說法。
作者:
bobo233
時間:
2020-5-8 10:53
直到單片機斷電、重啟,或者再次接收到串口中斷
作者:
Fireflying
時間:
2021-4-28 11:47
wulin 發(fā)表于 2020-5-8 10:30
51單片機的串行口緩沖寄存器(SBUF)的地址是99H,實際是2個緩沖器,寫SBUF的操作完成待發(fā)送數據的加載,讀SB ...
請問老師,假如我用程序檢測到RI變成1了,然后我用Rdata=SBUF讀取數據,但是不對RI操作,也就是RI不清零。而串口還有新的數據源源不斷的進來,這種情況下,SBUF里面的數據會更新嗎?會跟隨串口新進來的數據變化么?還是只要不清零RI就一直保持不變?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1