帮我诊断一下以下中断程序的问题吧,该程序目的是通过接收串口的数据包来更改s12中的三个参数:p,i,d的值,数据包的格式如下:第一个字节是数据位数,第二个字节是修改目标,后面就是数据了,例如:3p456。我遇到的问题如下,单片机复位后能够正常修改一次参数,后面再发就没有修改,因为LED没有变化,查看相关变量的值也没有变,或者就是不对,不知道是我的中断设置有问题还是逻辑有问题。 void Sci1_init(void) { SCI1BD=26;/*19200bps*/ SCI1CR1=0x13;/**/ SCI1CR2=0X2C;// } /*串口接收中断程序*/ #pragma CODE_SEG NON_BANKED void interrupt 21 SciRx_isr(void) { uint length,k; if(SCI1SR1_RDRF) /*接收中断*/ { SCI1SR1_RDRF=1; //清中断标志位 if(sci_flag) //sci_flag在主程序中初始化为1,目的是读数据包第一个字节,即数据长度 { length= SCI1DRL-0x30;/*读长度*/ sci_flag = 0; k = 0;//接收缓冲数组下标初始化 } else { if(k<=length) {sci_buffer[k]= SCI1DRL;//读接下来的数据,包括(p、i、d)和参数值 k++; } else { uint value=0; sci_flag = 1; for(k=1;k<=length;k++) { value = value*10+*(sci_buffer+k)-0x30;/*计算参数值,就是将包中的4、5、6转换成456*/ } switch(sci_buffer[0]) /*判断所要修改的是哪个参数*/ {case'p':p=valueORTB = 0X00;break;//用PORTB来点亮LED标记是否修改成功 case'i':i=valueORTB = 0X01;break; case'd':d=valueORTB = 0X03;break; default : PORTB = 0X07; break; } } } } asm cli; } #pragma CODE_SEG DEFAULT
|