[求助] 打开中断后不能执行while中的if语句了

yangxf1217   2013-9-25 17:30 楼主
int   fbnum=0x00;
char fbdata[20];
char usart0_rdata;
char usart1_rdata;                                
//*************************************************************************
//  串口初始化服务子程序
//*************************************************************************
void usart0_init()
{
  //UCSR0A=0x00;                                 //单倍速模式
  UCSR0B=0x98;                                 //接收中断允许                              
  UCSR0C=(1<   UBRR0H=baud_h;                               //写波特率的值
  UBRR0L=baud_l;
}
void usart1_init()
{
  //UCSR1A=0x00;                                 //单倍速模式
  UCSR1B=0x98;                                 //接收中断允许                              
  UCSR1C=(1<   UBRR1H=baud_h;                               //写波特率的值
  UBRR1L=baud_l;
}
//*************************************************************************
//  数据处理服务子程序
//*************************************************************************
void datado(char getdata)
{
int i=0;
  if(getdata=='a')
   {
    for(i=0;i<=fbnum;i++)
      {
      UDR1=fbdata;
     delay_ms(10);
   }
    UDR1=usart1_rdata;
     delay_ms(10);
   }
}

//*************************************************************************
//  串口0相关中断服务子程序
//*************************************************************************
//数据接收中断向量
SIGNAL(SIG_USART0_RECV)            //中断服务程序
{
usart0_rdata=UDR0;           //将接收到的数据取出
fbdata[fbnum]=usart0_rdata;
fbnum++;
}

//*************************************************************************
//  串口1相关中断服务子程序
//*************************************************************************
//数据接收中断向量
SIGNAL(SIG_USART1_RECV)            //中断服务程序
{
usart1_rdata=UDR1;           //将接收到的数据取出
    datado(usart1_rdata);
}

//*************************************************************************
//   主程序
//*************************************************************************
void main()
{
  usart0_init();                             //usart0串口初始化
  usart1_init();                              //usart1串口初始化配置

  SREG|=0x80;                                //开启全局中断
  while(1)
  {
   delay_ms(1000);
    if(usart1_rdata=='a')
   {
      delay_ms(10);
      int i;
    for(i=0;i<=fbnum;i++)
      {
      UDR1=fbdata;
     delay_ms(10);
   }
   }
    else
   {
    UDR1=usart1_rdata;
    delay_ms(10);
   }
  
  }
}



我给串口0输入一串字符,串口1输入a结果在串口1中输出了这串字符,并且输出一个a
但是在主程序中却不停的输出ox00,我就奇了怪了。if语句没有执行啊。

回复评论 (6)

不好意思各位大神上次的问题,我试了很久还是不行,请赐教,谢谢
@chunyang
点赞  2013-9-25 17:31
点赞  2013-9-25 17:32
建议你先写出程序流程图,编程错误应自行解决,而编程思想和程序结构方面的问题才适合讨论。
关于软件纠错,先要充分理解程序语句的含义和使用标准,同时弄清楚硬件的操作方法,然后单步跟踪查找。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2013-9-25 17:45
引用: 原帖由 chunyang 于 2013-9-25 17:45 发表
建议你先写出程序流程图,编程错误应自行解决,而编程思想和程序结构方面的问题才适合讨论。
关于软件纠错,先要充分理解程序语句的含义和使用标准,同时弄清楚硬件的操作方法,然后单步跟踪查找。
项目是要做一个设备:
1   采集串口0数据存储,
2    等待串口1的请求,把存储的数据发给串口1

我的思路是:
1    设置两个串口中断
2    串口0中断接收数据放入数组
3    串口1中断接收外部请求并判断,如果判断通过,则发送存储数据给串口1

我的程序测试结果是:
1    串口0中断采集到了数据存储正常
2    串口1中断接收到了正确的请求,并正常发送数组中数据

问题:
      某资料说串口中断中不能写太多程序,所以我把串口1中断中的数据处理移到主函数中;
      在串口1中断中设置了接收请求正常的标志,然后在主程序while(1)中用if语句判断,如果正确则输出数组数据到串口1。
      结果始终难以进入if中。
点赞  2013-9-26 10:06

回复 5楼yangxf1217 的帖子

这是典型的程序编制错误。
就编程原则来讲,中断服务程序越简单越好,尤其是你这个系统,要不然两个串口会因为优先级问题发生冲突导致数据丢失。精简的串口中断服务程序结构应该是:将串口寄存器数值送入一个特别定义的全局变量寄存器并设置一个标志,也就是说对两个字节的存储单元进行写操作,注意这两个存储单元要定义为全局变量。主程序在主循环中检测标志,如有则调用相应的子程序模块进行操作,操作结束后复位标志。这里同样要讲究程序结构,否则仍然有发生中断导致数据丢失的可能。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2013-9-26 14:42

回复 6楼chunyang 的帖子

谢谢,优先级的问题确实是存在,我还没有弄到那一步。
目前的问题解决了,是我基础不扎实的原因。全局变量volatile没有加,所以主函数检测不到中断的修改。
麻烦了。
点赞  2013-9-26 15:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复