打印

keil 让我很郁闷

[复制链接]
1762|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
因特网用户|  楼主 | 2009-10-23 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//////////  


  tmp = input_str[0];
    if(input_str[0]== 0xcc){
     Sync_Flag = 1;
     }
    if(tmp == 0xcc){
     Sync_Flag = 2;
     }
    if(input_str[1]==0x55 ){
     Sync_Flag = 3;
     }
////////////////////////////

input_str是一个定义的unsinged char的串口接收缓冲区,在keil中调试发现当
input_str[0]=0xcc,input_str[1]时,在判断 if(input_str[0]== 0xcc)时条件结果竟然为零,没有执行    Sync_Flag = 1;而 通过  tmp = input_str[0]赋值,在判断    if(tmp == 0xcc)结果为1,执行了     Sync_Flag = 2;在判断    if(input_str[1]==0x55 )时结果正确
天呐,这到底咋回事啊

相关帖子

沙发
hyg1984| | 2009-10-23 20:03 | 只看该作者
tmp = input_str[0];
    if(input_str[0]== 0xcc){
     Sync_Flag = 1;
     }
    if(tmp == 0xcc){
     Sync_Flag = 2;
     }
这个是什么意思?把2个相同值分别比较,难道你是传说中的-----牛角王----或者是没事找事

使用特权

评论回复
板凳
jerkoh| | 2009-10-23 21:14 | 只看该作者
哈哈 编译器 比你聪明多了

叫它做这种傻事 它当然不干

使用特权

评论回复
地板
dad123123| | 2009-10-23 21:46 | 只看该作者
上面两位,你们没碰到过这样的问题
楼主,我一年前用51的时候,碰到过类似的问题,没有猜错的话,你提供的代码应该是在中断ISR里面调用的,
我的问题也是出现在ISR中,那个程序我还保留在,有空研究下,
对这样的问题,我猜想
tmp = input_str[0];  //MCU会通过地址input_str来访问input_str[0]变量,然后将其值赋给tmp
if(input_str[0]== 0xcc)   //注意:这里很有可能是访问input_str[0]原先保存在寄存器中的值,MCU为了速度,在中断里面,要访问的全局变量,在下次中断时会,直接访问他上次中断时放在寄存器中的变量,所以 if(input_str[0]== 0xcc)  很有可能不成立,建议楼主把input_str[0]加volatile试试
个人猜想

使用特权

评论回复
5
jerkoh| | 2009-10-23 21:58 | 只看该作者
楼上 分析应该对的

看了下以为优化掉了一句 Sync_Flag = 1;

试了下 会执行这句

使用特权

评论回复
6
saiyiluqi| | 2009-10-24 09:51 | 只看该作者
????c程序看不太懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

161

主题

1040

帖子

0

粉丝