liyo2012 发表于 2016-8-31 07:24:17

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:01

把单片机当电脑用。。。。。。。。。。

liyo2012 发表于 2016-9-1 06:35:38

devcang 发表于 2016-9-1 00:08
把单片机当电脑用。。。。。。。。。。

我觉得还是实现方法的问题,
页: [1]
查看完整版本: STC串口数据校验问题