3 回答

TA貢獻1868條經(jīng)驗 獲得超4個贊
用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)先級概念,中斷處理結(jié)束前不接受新中斷,沒必要關(guān)接收中斷
RX_Buffer[i]=UDR;
// delay(5);
i++;
if(i==12)
{
i=0;
flag=1;
//delay(5);
}

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

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