打印
[STC单片机]

大神帮我看看这个 if 语句的小白问题,我已经困在这很久...

[复制链接]
1615|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TianYN|  楼主 | 2015-3-7 17:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 TianYN 于 2015-3-7 22:33 编辑

问题已经解决:又犯了一个低级错误,一个很基础很根本的错误,在用电脑串口助手发送数据给单片机时选择的发送模式是
HEX模式,本来想发送的是12,于是在串口助手中就填写12,但十六进制的12怎么能和十进制的语句else if(FAS == 12)进行匹配嘛,
十六进制的12转换成十进制后是18,当然不能进入这到个 if 判断里去了,如果不改程序非要进入到这个 if 语句中,在串口助手中输入
0c就可以了,十六进制的0c转换成十进制后就是12.


出现问题的代码在这
请问怎么把电脑串口发送的数据12或20赋值给FAS进行 if 判断?
unsigned char FAS = 0;
FAS = SBUF ;
P01 = 1;
P02 = 1;
if(FAS == 7)
   {     
     P01 = 0;
   }               
     else if(FAS == 12)
             {
              P02 = 0;
              }
这个程序打算用来做一个简单的单片机UART串口控制,用电脑的串口发送数据,单片机串口接收后执行相应的操作,电脑串口发送7时单片机都能正常把IO口P0.1电平置0,但发送12时单片机死活不能把P0.2置0,试过很多方法都不行,现在已经确定电脑和单片机的UART通信是正常的,IO口工作也正常。
  问题就应该在这句else if(FAS == 12)判断语句中,我想过可能是串口使用的是十六进制和这里判断语句中的12可能不匹配,所以把12换成十六进制的0x0c,但是换了后还是不行,单片机根本不能执行else if里面的指令,不能把把P0.2置0。
  希望知道这个问题的大神能帮我指导一下,哪怕是点一下问题的关键也行,我知道这个问题可能很基础,很根本,因为我犯过很多次这样的错误,但是这次这个我试了好久都没弄好,如果大神觉得这个问题太简单太基础,不愿意直接回答,给我指点一下就好,我自己去查找这方面的问题,我现在是找问题都不知道怎么找了。

相关帖子

沙发
TianYN|  楼主 | 2015-3-7 18:17 | 只看该作者
wcywky 发表于 2015-3-7 17:59
else if(FAS == 12)
             {
              P02 = 0;

试了一下,还是不可以,这语句到底是出了什么问题啊?

使用特权

评论回复
板凳
nuaabob| | 2015-3-7 18:19 | 只看该作者
这个程序的逻辑很有意思,在开始判断FAS值之前,已经把P01、P02都清零了,然后再根据FAS值是否为7或12分别给P01和P02清零?

使用特权

评论回复
地板
nuaabob| | 2015-3-7 18:24 | 只看该作者
有可能是没有加串口接收中断标志位清零语句 “RI=0;” ,你调试的时候上位机先送的是7,可以接收到,然后继续再送12,发现怎么都接收不到数据了,因为RI没有清零,程序就死在中断里了。
仅仅只是猜测,请试一试。

使用特权

评论回复
5
TianYN|  楼主 | 2015-3-7 19:05 | 只看该作者
nuaabob 发表于 2015-3-7 18:19
这个程序的逻辑很有意思,在开始判断FAS值之前,已经把P01、P02都清零了,然后再根据FAS值是否为7或12分别 ...

呃,复制代码的时候粗心了,一开始P01和P02初始值是1的,置的高电平,要实现收到信号后置为低电平。

使用特权

评论回复
6
TianYN|  楼主 | 2015-3-7 19:11 | 只看该作者
nuaabob 发表于 2015-3-7 18:24
有可能是没有加串口接收中断标志位清零语句 “RI=0;” ,你调试的时候上位机先送的是7,可以接收到,然后 ...

if(RI)
        {
                RI = 0;
                RX1_Buffer[RX1_Cnt] = SBUF;                //保存一个字节
                if(++RX1_Cnt >= RX1_Lenth)        RX1_Cnt = 0;        //避免溢出处理
        }

加了的,调试的时候我把程序设计为收到电脑数据后还要返回给电脑,所以我电脑发送12给单片机时电脑串口调试助手又收到12的。这样基本上就确定单片机是收到12的,就是为什么它收到12后不按照程序设定的==12就执行P02为0呢?我觉得这应该是简单的,但是就是调试不出来,这个BUG快把我搞疯了。

不管怎么样,谢谢你帮我提的意见了。

使用特权

评论回复
7
TianYN|  楼主 | 2015-3-7 19:18 | 只看该作者
nuaabob 发表于 2015-3-7 18:24
有可能是没有加串口接收中断标志位清零语句 “RI=0;” ,你调试的时候上位机先送的是7,可以接收到,然后 ...

你说不会是 if 里执行的判断等于的范围不能超过9吧,难道在单片机里 if 的等于判断真不能超过9?真是有意思啊。

使用特权

评论回复
8
xjjspace| | 2015-3-7 19:56 | 只看该作者
首先保证配置输出一定正确,可先检查一遍。
然后看下硬件连接,P02引脚是不是搭到高电平上了。

如果你发送了12,单步调试追着看确实没进到那个elseif里面,那一般都代码问题。看下一些参数的定义吧,u8 u16之类的越界。
条件允许的话,更换一个MCU试下。

使用特权

评论回复
9
nuaabob| | 2015-3-7 20:08 | 只看该作者
TianYN 发表于 2015-3-7 19:11
if(RI)
        {
                RI = 0;

好吧,那有可能是这样:我不知道你用的是什么串口助手,如果是STC_ISP自带的串口助手,发出的数字都是十六进制的,也就是说,你发送的12其实是0x12,else if分支当然进不去啦。

使用特权

评论回复
10
hdp7891000| | 2015-3-7 20:17 | 只看该作者
nuaabob 发表于 2015-3-7 20:08
好吧,那有可能是这样:我不知道你用的是什么串口助手,如果是STC_ISP自带的串口助手,发出的数字都是十 ...

根据他上面描述的只能到9我怀疑就是这个问题

使用特权

评论回复
11
ys46501| | 2015-3-7 21:24 | 只看该作者
个人猜测,你发送12,串口助手是分开发送的,先发送1,再发送2。它并不知道你发送的是一个数,它只把12当两个字符来发送。你可以测试下,
else if(FAS == 12)把里面的12改成1或2.然后用串口助手发送12,看可不可以执行if里面的语句?

使用特权

评论回复
评论
cnlxin 2015-3-7 22:33 回复TA
注意是不是没有选择十六进制发送? 
12
TianYN|  楼主 | 2015-3-7 22:34 | 只看该作者
nuaabob 发表于 2015-3-7 20:08
好吧,那有可能是这样:我不知道你用的是什么串口助手,如果是STC_ISP自带的串口助手,发出的数字都是十 ...

YES,就是这个问题,果然是大神。谢谢了。

使用特权

评论回复
13
TianYN|  楼主 | 2015-3-7 22:35 | 只看该作者
hdp7891000 发表于 2015-3-7 20:17
根据他上面描述的只能到9我怀疑就是这个问题

嗯,就是那个问题,没注意到这个串口助手的问题啊,都怪自己太粗心了。

使用特权

评论回复
14
TianYN|  楼主 | 2015-3-7 22:37 | 只看该作者
xjjspace 发表于 2015-3-7 19:56
首先保证配置输出一定正确,可先检查一遍。
然后看下硬件连接,P02引脚是不是搭到高电平上了。

是串口助手的问题,l因为串口助手发送的是十六进制的12,与if语句中的十进制12不能进行匹配,所以才不能进入那个if语句中。谢谢你帮我出主意了。

使用特权

评论回复
15
dzguang| | 2015-3-8 00:15 | 只看该作者
看到最后,我知道我的错了~

使用特权

评论回复
16
ilikerome| | 2015-3-8 08:25 | 只看该作者
mark学习一下

使用特权

评论回复
17
佼佼~~| | 2015-3-8 10:53 | 只看该作者
赞一个

使用特权

评论回复
18
学习。。。

使用特权

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

本版积分规则

1

主题

8

帖子

0

粉丝