首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]SCI1接收中断怪问题

[求助]SCI1接收中断怪问题

帮我诊断一下以下中断程序的问题吧,该程序目的是通过接收串口的数据包来更改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

把整个PROJECT传上来,看看,
个人BLOG:http://blog.eccn.com/u/107300/index.htm

else
{
uint value=0;
sci_flag = 1;
for(k=1;k<=length;k++)
{

上面的else应该在k=length时执行吧

兄弟,问题解决了吗

返回列表