89s51通讯程序调试接收不稳定,那位朋友做过交流一下。
没起始位判断程序:
/*****************************************************************************
* seri_send *
******************************************************************************
* Input Variables: *
* uchar *p,uchar data_len *
* Return Variables: *
* None *
*****************************************************************************/
void seri_send( uchar *p,uchar data_len )
{
uchar i;
for(i=1;i<data_len;i++) {
SBUF=0x30+i;
while(TI==0);
TI=0;
}
SBUF=0x4f;
while(TI==0);
TI=0;
SBUF=0x4b;
while(TI==0);
TI=0;
}
/*****************************************************************************
* recieve_comm *
******************************************************************************
* Input Variables: *
* None *
* Return Variables: *
* None *
*****************************************************************************/
void recieve_comm(void) interrupt 4 using 2{
if(RI==1) num=SBUF;
RI=0;
send_buf[m_i]=num;
m_i++;
if(m_i>9)m_i=0;
}
接收数据顺序不确定。
有起始位判断程序:
/***********************************************
* seri_send *
************************************************
* Input Variables: *
* uchar *p,uchar data_len *
* Return Variables: *
* None *
************************************************/
void seri_send(uchar data_len )
{
uchar i;
/* send_buf[0] = *p;
for( i=0; i< data_len; i++)
{
p++;
send_buf[i]=*p;
SBUF = send_buf[i];
while( TI == 0 );
TI = 0;
}*/
SBUF=0xcc;
while(TI==0);
TI=0;
for(i=1;i<data_len;i++) {
SBUF=0x30+i;
while(TI==0);
TI=0;
}
SBUF=0x4f;
while(TI==0);
TI=0;
SBUF=0x4b;
while(TI==0);
TI=0;
SBUF=0xdd;
while(TI==0);
TI=0;
}
/*****************************************************************************
* recieve_comm *
******************************************************************************
* Input Variables: *
* None *
* Return Variables: *
* None *
*****************************************************************************/
void recieve_comm(void) interrupt 4 using 2{
if(RI==1) num=SBUF;
RI=0;
if( num == 0xcc ){ /* 是开始字符吗? */
flag_f = 1;
}
else
{
if(flag_f==1){ /* 已经接收到开始字符了 */
if( num !=0xdd) { /*如果接收到的不是结束字符,则是数据帧中的数据*/
send_buf[m_i]=num;
m_i++; num=0; /* 保存到缓冲区中 */
}
else /*接收到结束字符了*/
{
m_i=0;
flag_f=0;
}
}
else
if(flag_f==0) /*如果没有事先接收到开始字符,说明不是数据帧的开始,返回*/
{
return ;
}
}
if(TI) //处理发送中断
{
TI=0;
}
}
收不到数据。
那位高手指点一二!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
发送时:
SBUF=0x30+i;
while(TI==0);
TI=0;
接收时:
void recieve_comm(void) interrupt 4 using 2{
...
if(TI) //处理发送中断
{
TI=0;
}
程序已在中断里将TI置为0,那么发送数据时while(TI==0);将成为死循环.
修改程序: "处理发送中断"那几句去掉
一周热门 更多>