|
原来的程序是单片机收到数据后直接判断接收到数据的结果,没有数据返回给上位机确认。
导致有时候上位按的按键没有办法执行,或是一个按键代码要发两三次才有效果。
现在想改成需要返回数据给上位机数据,没有收到就重发的!
下面是三个主要函数:
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[i];
while(!TI);
TI=0;
}
ES=1;
}
void uart_receive() interrupt 4 //接收中断函数
{
unsigned char ch;
/************
if((Ctrl_buf[6]!=0xa1)||(Ctrl_buf[6]!=0xa2)||(Ctrl_buf[6]!=0xb1)||(Ctrl_buf[6]!=0xb2))
{ Ctrl_buf[6]=0x00;
}
***********此段是因为按键时下次按重要重复一次上次的按键,第二次按键才能正确执行本次按键,所以自作聪明清了一次Ctrl_buf[6]************/
if(RI)
{
ch=SBUF;
if(Rec_flag==1)
{
Ctrl_buf[Rec_count]=ch;
Rec_count++;
}
if(ch==0xaa) //0xaa ,8个字节数组最后一位,这个判断是不是很不合理,第一个数组会被丢掉!
{Rec_flag=1;
Rec_count=0;
banduan();//这里收完8八字节后,就作报文判断。
/******************************
A处 : //原来打算在这里加上返回给上位机的数据的,结果,返回的 都 是八个00 .
Rec_buf[0]=Ctrl_buf[0]//这里重装八个收到的数给发送数组
Rec_buf[1]=Ctrl_buf[1]
Rec_buf[2]=Ctrl_buf[2]
Rec_buf[3]=Ctrl_buf[3]
Rec_buf[4]=Ctrl_buf[4]
Rec_buf[5]=Ctrl_buf[5]
Rec_buf[6]=Ctrl_buf[6]
Rec_buf[7]=Ctrl_buf[7]
send1();
*************************************/
}
}
RI=0;
}
void banduan () //判断函数
{
if(Ctrl_buf[6]==0xa1)
{keynum=0xa1; // 如果收到Ctrl_buf[6]=0xa1 就是上升键
up_key();
}
}
问题:程序哪里不合理?需要在哪个地方加上收到数组后,原封发回给上位机,使上位机不再重发,目的是,为了数据检查正确。
|
|