串口通迅程序求助!
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=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 = *p;
for( i=0; i< data_len; i++)
{
p++;
send_buf=*p;
SBUF = send_buf;
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=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);将成为死循环.
修改程序: "处理发送中断"那几句去掉
程序已在中断里将TI置为0,那么发送数据时while(TI==0);将成为死循环.
谢谢,去掉那几句还是不好用!
单片机自己收发死机。
中断里最好不要用return 谢谢 lcw_swust 问题基本解决。
页:
[1]