3 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
用ICC產(chǎn)生的初始化程序
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
//uart has received a character in UDR
//UCSRB&=~BIT(RXCIE); //接收完畢中斷不使能
//AVR沒有中斷優(yōu)先級(jí)概念,中斷處理結(jié)束前不接受新中斷,沒必要關(guān)接收中斷
RX_Buffer[i]=UDR;
// delay(5);
i++;
if(i==12)
{
i=0;
flag=1;
//delay(5);
}

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
當(dāng)然老是接收到00了,我給你解釋一下:你的串口中斷函數(shù)不止是在接收數(shù)據(jù)的時(shí)候執(zhí)行,在執(zhí)行while(!Ti);時(shí)等待發(fā)送完成時(shí)也會(huì)觸發(fā)中斷函數(shù),此時(shí)sbuf里面為空,數(shù)據(jù)之前被取走了。解決辦法:把串口中斷函數(shù)改為:void ser()interrupt 4
{if(Ri)
{Ri=0;
a=sbuf;
}
if (Ti)
{
}}
當(dāng)然老是接收到00了,我給你解釋一下:你的串口中斷函數(shù)不止是在接收數(shù)據(jù)的時(shí)候執(zhí)行,在執(zhí)行while(!Ti);時(shí)等待發(fā)送完成時(shí)也會(huì)觸發(fā)中斷函數(shù),此時(shí)sbuf里面為空,數(shù)據(jù)之前被取走了。解決辦法:把串口中斷函數(shù)改為:void ser()interrupt 4{if(Ri){Ri=0;a=sbuf;
flag=1;
}if (Ti){}}
再說一句,sbuf里面的數(shù)之前被取走的話就為0了,速度給分啊,用手機(jī)打了老半天

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
void ser() interrupt 4 //串口中斷函數(shù)
{
if(RI)
{
RI=0;
a=SBUF; //收到的數(shù)據(jù)存入緩沖器,然后賦給a
flag=1;
}
}
另外看看你的波特率,應(yīng)該有問題,9600的話初值應(yīng)該是0xfd,初始化時(shí)也沒有設(shè)置1T模式,缺省狀態(tài)應(yīng)該12T模式的。
添加回答
舉報(bào)