专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 单片机

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

发布时间:2010-06-14 15:56:22 文章来源:www.iduyao.cn 采编人员:星星草
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这个数组这样不就溢出了。。。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: