STC串口数据校验问题
原来的程序是单片机收到数据后直接判断接收到数据的结果,没有数据返回给上位机确认。导致有时候上位按的按键没有办法执行,或是一个按键代码要发两三次才有效果。
现在想改成需要返回数据给上位机数据,没有收到就重发的!
下面是三个主要函数:
STC 12C 5a62S2 芯片
void UartInit(void) //9600bps@4MHz 串口初始化函数 用软件生成的!
{
PCON &= 0x7F; //??????
SCON = 0x50; //8???,?????
AUXR |= 0x04; //?1T
BRT = 0xF3; //?????????????
AUXR |= 0x01; //??1?????????????????
AUXR |= 0x10; //??????????
ES=1;
EA=1;
}
void send1() //发送8个字节函数
{
unsigned char i;
ES=0;
for(i=0;i<8;i++)
{ delay1ms(1) ;
SBUF=Rec_buf;
while(!TI);
TI=0;
}
ES=1;
}
void uart_receive() interrupt 4 //接收中断函数
{
unsigned char ch;
/************
if((Ctrl_buf!=0xa1)||(Ctrl_buf!=0xa2)||(Ctrl_buf!=0xb1)||(Ctrl_buf!=0xb2))
{ Ctrl_buf=0x00;
}
***********此段是因为按键时下次按重要重复一次上次的按键,第二次按键才能正确执行本次按键,所以自作聪明清了一次Ctrl_buf************/
if(RI)
{
ch=SBUF;
if(Rec_flag==1)
{
Ctrl_buf=ch;
Rec_count++;
}
if(ch==0xaa) //0xaa ,8个字节数组最后一位,这个判断是不是很不合理,第一个数组会被丢掉!
{Rec_flag=1;
Rec_count=0;
banduan();//这里收完8八字节后,就作报文判断。
/******************************
A处 : //原来打算在这里加上返回给上位机的数据的,结果,返回的 都 是八个00 .
Rec_buf=Ctrl_buf//这里重装八个收到的数给发送数组
Rec_buf=Ctrl_buf
Rec_buf=Ctrl_buf
Rec_buf=Ctrl_buf
Rec_buf=Ctrl_buf
Rec_buf=Ctrl_buf
Rec_buf=Ctrl_buf
Rec_buf=Ctrl_buf
send1();
*************************************/
}
}
RI=0;
}
void banduan () //判断函数
{
if(Ctrl_buf==0xa1)
{keynum=0xa1; //如果收到Ctrl_buf=0xa1 就是上升键
up_key();
}
}
问题:程序哪里不合理?需要在哪个地方加上收到数组后,原封发回给上位机,使上位机不再重发,目的是,为了数据检查正确。
把单片机当电脑用。。。。。。。。。。 devcang 发表于 2016-9-1 00:08
把单片机当电脑用。。。。。。。。。。
我觉得还是实现方法的问题,
页:
[1]