|  
 
 
主机通信程序: //------------串口2发通信函数------------------// uchar master(uchar addr,uchar command) {  uchar aa,i,p;    while(1) {  S2BUF=addr;   //发送呼叫地址 while(!(S2CON&0X02));  S2CON &=0XFD; //清除TI while(!(S2CON&0X01)); S2CON &=0XFE; //清除RI if(S2BUF!=addr) //若地址错,发复位信号 err();     else {  S2CON&=0XF7;       //清除地址标志S2TB8 S2BUF=command; //发主机控制命令 while(!(S2CON &0X02)); S2CON &=0XFD;  
while(!(S2CON&0X01)); S2CON &=0XFE; aa=S2BUF; //接收从机状态 if((aa&&0x08)==0x08) //若命令未被接收 { S2CON|=0x08; //把S2TB置1,复位 err();  } else {  if(command==0x01) //是发送命令 {  if((aa&0x01)==0x01) //从机已准备好接收 {   do {  p=0; //清除校验和 for (i=0;i<bn;i++) { S2BUF=uart2_sBuf[i];    //发送一次数据 p+=uart2_sBuf[i]; 
while(!(S2CON&0X02)); S2CON&=0xfd; }   S2BUF=p; //发送校验和 while(!(S2CON&0X02)); S2CON&=0xfd;  
while(!(S2CON&0X01)); S2CON&=0xfe;  }while(S2BUF!=0); S2CON|=0x08;     //发复位信号 return(0);  } } else {  if((aa&0x02)==0x02) {  clearRbuf();    //清除接收缓存 while(1) { p=0; for(i=0;i<bn;i++) {  while(!(S2CON&0X01)); S2CON&=0xfe; uart2_rBuf[i]=S2BUF; p+=uart2_rBuf[i];   } while(!(S2CON&0X01)); S2CON&=0xfe; if(S2BUF==p) { S2BUF=0X00;      while(!(S2CON&0X02)); S2CON&=0xfd; break;  } else { S2BUF=0XFF; while(!(S2CON&0X02)); S2CON&=0xfd; } }  S2CON|=0x08; return(0); }  else   //从机没信息要发或者出错 { clearRbuf(); S2CON|=0x08;     //发复位信号  return(0); }   }  
}  } } 
} 从机接收程序: //------------接收中断函数-----------------// void receive() interrupt 8  { uchar a;  S2CON &=0XFE;  
IE2    =0X00; //关闭中断 
//清除RI if(S2BUF!=ID) //判断是否是本机地址 { //不是本机地址,继续监听 IE2=0X01;  goto reti; }  S2CON&=0XDF; //是本机地址,把SM2清零,接收数据 S2BUF=ID; //把本机地址发回主机校验 while(!(S2CON&0X02)); S2CON&=0XFD; 
while((S2CON &0X01)!=1); S2CON&=0XFE;     if((S2CON&0X04)==1) //判断RB8是否为1,为1,SM2=1,继续监听 { S2CON|=0x20;  IE2=0X01; goto reti; } a=S2BUF;  if(a==0x01) //是主机发数据给从机命令 { //是否准备好接收数据 if(rready==1) S2BUF=0X01;  else S2BUF=0X00; while(!(S2CON&0X02)); S2CON &= 0XFD; // while((S2CON &0X01)!=1); // S2CON &= 0XFE; if((S2CON &0X04)==1) { S2CON|=0x20; IE2=0X01; goto reti; } sre(); //接收数据  } else {   if(a==0x02) //是从机发送数据给主机命令 {  if(tready==1) S2BUF=0x02;  else { S2BUF=0X00; S2CON|=0x20; IE2=0X01; goto reti; } while(!(S2CON &0X02)); S2CON &= 0XFD; // while(!(S2CON &0X01)); // S2CON &= 0XFE; if((S2CON &0X04)==1) {  SM2|=0x20;  IE2=0X01; goto reti; }   send(); } else    //出现异常 {  S2BUF=0X80; while((S2CON &0X02)!=1); S2CON &= 0XFD; S2CON|=0x20; IE2=0X01; } } reti:; } 提一点建议: 屏蔽其他地方,用单片机和串口助手调试,先实现一个字符的发送,确保正确后,循环发送字符就是字符串了。如果字符串发送也成功,证明串口发送正确。 
反过来串口助手发数据,单片机接收,如果正确,说明接收也是OK的。 
如果项目还有问题,找其他的逻辑、数据处理部分吧 
 |