本帖最后由 nickyamw 于 2013-10-17 20:24 编辑
我用的是华邦的W79E532,时钟频率40MHz,2T模式,用串口中断方式接收一帧数据(每帧11或10个字节),但有时候可以完整接收一帧,有时却只接收到最后一个字节,成功接收一帧的概率大概70%左右,
请问我这程序有什么问题?怎么提高串口接收数据的成功率?
问题已经解决,是程序里SD卡部分还有一个关总中断的行为。
串口初始化函数:
void uart0Init(void)
{
EA = 0;
CKCON = 0xc7;
TR2=0;
CKCON = 0xf1;
SCON=0x50;
RCAP2H=TH2=0xff; ////115200 40M RCAP2HL=40M/(32*b)
RCAP2L=TL2=0xf5;
T2CON=0x34;
//SCON=0xD0;
T2MOD=0x00;
TR2=1;
RI = 0;
ES = 1;
EA = 1;
串口中断服务函数:
{
uint8 xdata *p_buf;
p_buf = UART_BUF + uart_wrlen;
if(RI)
{
uart_outoftime = 1;
RI = 0;
if(uart_wrlen > 39) return;
*p_buf = SBUF;
uart_wrlen ++;
}
}
串口处理函数:
void uart0_CMDPackage(void)
{
uint8 i;
uint8 xdata *p_Dptr;
uart_outoftime++;
if(!uart_outoftime) uart_outoftime = 255;
if(!uart_wrlen) return;
if(uart_outoftime <= 240 ) // 整个程序,一次大循环至少应该会有几ms,隔了一段时间没接收到下一个字节的数据,就当作一帧数据接收完
{
return;
}
//uart_wrlen = 0;
uart_outoftime = 255 ;
p_Dptr = UART_BUF;
while(uart_wrlen)
{
if(*p_Dptr != 0xAA)//帧数据以0XAA开头
{
uart_wrlen--;
p_Dptr++;
}
else
{
break;
}
}
uart_wrlen = 0;
//后面接具体的处理过程
}
今天下午我也试了另外的方法,就是在串口中断函数里用轮询的方式接收一帧数据,每次固定接收11个字节,中断函数被我改成这样子,但接收一帧的成功率也没怎么改善
uint8 uart0_RcvChar(void)
{
uint16 i;
i = 10000;
do
{
if(RI) break;
}
while(--i);
RI = 0;
return SBUF;
}
void uart0_ISR(void) interrupt 4 //Uart0 interrupt
{
uint8 xdata *p_buf;
//p_buf = SDRAMBUF0_ADDR + 2027;
p_buf = UART_BUF + uart_wrlen;
if(RI)
{
uart_outoftime = 5;
//RI = 0;
//if(uart_wrlen > 39) return;
//*p_buf = SBUF;
//uart_wrlen ++;
*p_buf = uart0_RcvChar();
if(*p_buf++ != 0xAA) return; //帧数据以0XAA开头
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
*p_buf++ = uart0_RcvChar();
uart_wrlen ++;
}
}
|