9164|6

900

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

打开中断后不能执行while中的if语句了 [复制链接]

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语句没有执行啊。
此帖出自单片机论坛

最新回复

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

回复
举报

900

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
不好意思各位大神上次的问题,我试了很久还是不行,请赐教,谢谢
@chunyang
此帖出自单片机论坛
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
https://bbs.eeworld.com.cn/thread-413347-1-1.html之前的帖子。求赐教啊
此帖出自单片机论坛
 
 
 

回复

1万

帖子

140

TA的资源

版主

4
 
建议你先写出程序流程图,编程错误应自行解决,而编程思想和程序结构方面的问题才适合讨论。
关于软件纠错,先要充分理解程序语句的含义和使用标准,同时弄清楚硬件的操作方法,然后单步跟踪查找。
此帖出自单片机论坛

点评

项目是要做一个设备: 1 采集串口0数据存储, 2 等待串口1的请求,把存储的数据发给串口1 我的思路是: 1 设置两个串口中断 2 串口0中断接收数据放入数组 3 串口1中断接收外部请求并判断,如  详情 回复 发表于 2013-9-26 10:06
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

5
 
原帖由 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 14:42
 
 
 

回复

1万

帖子

140

TA的资源

版主

6
 

回复 5楼yangxf1217 的帖子

这是典型的程序编制错误。
就编程原则来讲,中断服务程序越简单越好,尤其是你这个系统,要不然两个串口会因为优先级问题发生冲突导致数据丢失。精简的串口中断服务程序结构应该是:将串口寄存器数值送入一个特别定义的全局变量寄存器并设置一个标志,也就是说对两个字节的存储单元进行写操作,注意这两个存储单元要定义为全局变量。主程序在主循环中检测标志,如有则调用相应的子程序模块进行操作,操作结束后复位标志。这里同样要讲究程序结构,否则仍然有发生中断导致数据丢失的可能。
此帖出自单片机论坛

点评

谢谢,优先级的问题确实是存在,我还没有弄到那一步。 目前的问题解决了,是我基础不扎实的原因。全局变量volatile没有加,所以主函数检测不到中断的修改。 麻烦了。  详情 回复 发表于 2013-9-26 15:06
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

7
 

回复 6楼chunyang 的帖子

谢谢,优先级的问题确实是存在,我还没有弄到那一步。
目前的问题解决了,是我基础不扎实的原因。全局变量volatile没有加,所以主函数检测不到中断的修改。
麻烦了。
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表