使用伟福仿真器,晶振12MHz,波特率2400bps。
void serial_Init(void) //模式1,8位自动重装,2400bps,12MHz
{
SCON=0x50;//串口工作方式为1,SCON允许串口接收位REN置1
TMOD=0x20;//工作方式控制寄存器TMOD,控制定时器1工作在模式2,8位自动重装
TH1=0xF3; //定时计数器1高8位
TL1=0xF3; //定时计数器1低8位,设置T1的溢出率
TR1=1;//定时控制寄存器TCON中的运行控制位,置1表示计数器1启动工作
ES=1;//打开串口中断
EA=1;//允许中断
RI=0;
TI=0;
}
uchar data Send_string=0;//接收数据完成标志,1表示完成
uchar data len=0;
uchar data N;
uchar data b;
sbit Pin=P0^6;//管脚P0^6用作通讯显示
com_interrupt(void) interrupt 4 //串口中断子程序
{
Pin=0;//通讯指示灯亮
if(RI)
{
RI = 0;
b=SBUF;
if((b==0xBB)&&(len==0))//接收开始符为0xBB的数据
{
temp[0]=b;//将开始符赋给temp[0]
}
else//继续接收开始符0xBB后的数据
{
len++;
temp[len]=b;
if(len>6)
{
if((b==0xDD)&&(len>=temp[6]+8))//收到结束符且数据长度为(temp[6]+8)(这是字符串的要求)时,结束接收
{
N=len;//传递数据长度,数据长度为(N+1)
len=0;//置0,便于下一次接收
Send_string=1;//接收完成标志
}
}
}
}
Pin=1;//通讯指示灯灭
}
波特率应该没问题,因为已经接收到数据只是接收的错误。而且之前做过接受一个字节的实验,当时接收的是正确的。
该中断子程序要接收的是以BB作为开始符,以DD作为结束符的一个字符串。
当用串口助手以16进制发送:BB 00 00 00 01 21 05 01 00 77 55 00 01 AF DD时,data区显示的接收到的数据始终是22 FF FF FD BD F5 FD FF 11 55 FF FD A1 11 07,后来变成22 FF FF FD BD F5 FD FF 11 55 FF FD A1 11 ,少了一个07。我怀疑是中断子程序的问题,可是我也没看出来哪里有问题。本人初学51C语言,请教高手这是为什么呢 |