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这个数组这样不就溢出了。。。