首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

RS232的有关问题,理解不够,指点下吧,很急

2012-02-23 
RS232的问题,理解不够,指点下吧,很急啊看到一个232的串口通信的程序,因为以前自己做的只是单字节传送,程序

RS232的问题,理解不够,指点下吧,很急啊
看到一个232的串口通信的程序,因为以前自己做的只是单字节传送,程序也较为简单。现在想了解下多字节传送看了些232协议的资料,看太快没理解上去。又看了个程序,有些不理解的地方,希望指点一下,不懂的地方已经标注。(真没时间搞这个程序了,明天月底新项目要开始)
#include <reg51.h>  
#include <string.h>  
#define INBUF_LEN 4 
unsigned char inbuf1[INBUF_LEN];  
unsigned char checksum,count3;  
bit read_flag=0;  
void init_serialcomm( void )  
{  
 SCON=0x50 ;
 TMOD|=0x20 ; 
 PCON|=0x80 ; 
 TH1=0xF4 ; 
 IE|=0x90 ; 
 TR1=1 ; 
  //TI=1;  
}  
void send_char_com(unsigned char ch)  
{  
 SBUF=ch;  
 while(TI==0);  
 TI= 0;  
}  
void send_string_com(unsigned char *str, unsigned int strlen)  
{  
 unsigned int k=0 ;  
 do  
 {  
  send_char_com(*(str + k));  
  k++;  
 }while(k<strlen);  
}  
void serial()interrupt 4 using 3  
{  
  if(RI)  
  {  
  unsigned char ch;  
  RI=0;  
  ch=SBUF;  
  if(count3>127) //这句看不懂,为什么是127?不理解
  {  
  count3=0;  
  inbuf1[count3]=ch;  
  checksum=ch-128; //这应该是校验,可是不懂,汗颜,求详解
  }  
  else  
  {  
  count3++;  
  inbuf1[count3]=ch;  
  checksum^=ch;  
  if((count3==(INBUF_LEN-1))&&(!checksum))  
  {  
  read_flag=1;
  }  
  }  
  }  
}  
main()  
{  
 init_serialcomm();
 while( 1 )  
 {  
  if(read_flag)
  {  
  read_flag= 0;
  send_string_com(inbuf1,INBUF_LEN);  
  }  
 }  
}

[解决办法]
错了 这个count3应该是ch
这个函数是接收中断 意思就是每次有效包为4个字符 第一个是大于127即最高位为1作为头标记 如果连续收到>127的则不断放过 只保留最新一个 并作为校验开始值 之后如果连续收到3个<=127的则完成接收
[解决办法]
这应该是判定是否是ASCII字符,
ASCII字符只用低7位的。
[解决办法]
既然用到了异或校验,那checksum是否应该初始化为0?

你把校验的代码屏蔽掉,再测试一下。
[解决办法]
补充:发送和接收都会产生中断,
void serial()interrupt 4 using 3 {

if(RI) {...
}
if (TI) {...
}
...
}
[解决办法]
#define INBUF_LEN 4 
unsigned char inbuf1[INBUF_LEN];

else 

count3++; 
inbuf1[count3]=ch;

inbuf1这个数组这样不就溢出了。。。

热点排行