发新帖我要提问
12
返回列表
打印

【单片机C语言救急】为什么这个变量会变成负数了?

[复制链接]
楼主: henangongda123
手机看帖
扫描二维码
随时随地手机跟帖
21
henangongda123|  楼主 | 2018-6-11 14:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
一叶倾城wwq 发表于 2018-6-11 14:30
抱歉楼主,刚才的回复我没仔细看你的程序,现在我个人而言是你的同一个缓冲区(变量)重复使用,没有清空导 ...

好的 晚上我验证一下您的建议。

使用特权

评论回复
22
henangongda123|  楼主 | 2018-6-11 14:50 | 只看该作者
XZL 发表于 2018-6-11 14:36
应该定义成无符号数据

嗯 嗯

使用特权

评论回复
23
chongdongchen| | 2018-6-11 16:09 | 只看该作者
楼主目前的问题是为什么定义成long就不行了??
分析1楼数据:27470 = 0x6B * 256 + 0x4E。
把编译器强制转换考虑进去,很明显0x6B、256、0x4E也都不是负数(最高位不是1)。
也就是说正数经过乘法和加法后变成负数了(注意运算过程没有溢出,没有出现最高位是1)。

所以首先考虑的是SHT31_R_Data数组,在这个计算过程中有没有发生改变?
比如在中断函数中 SHT31_R_Data[3] 变成了大于127的数。

使用特权

评论回复
24
henangongda123|  楼主 | 2018-6-11 16:14 | 只看该作者
chongdongchen 发表于 2018-6-11 16:09
楼主目前的问题是为什么定义成long就不行了??
分析1楼数据:27470 = 0x6B * 256 + 0x4E。
把编译器强制转 ...

数组是uchar型哦

使用特权

评论回复
25
chongdongchen| | 2018-6-11 16:16 | 只看该作者

uchar类型范围是0-255

使用特权

评论回复
评论
chongdongchen 2018-6-11 16:21 回复TA
你可能没看懂我说的意思吧 
26
henangongda123|  楼主 | 2018-6-11 16:35 | 只看该作者
chongdongchen 发表于 2018-6-11 16:16
uchar类型范围是0-255

还真没有,另外我没有使用中断功能。

使用特权

评论回复
27
一叶倾城wwq| | 2018-6-11 16:38 | 只看该作者
henangongda123 发表于 2018-6-11 14:50
好的 晚上我验证一下您的建议。

嗯,楼主试试,不行再讨论

使用特权

评论回复
28
xuyaqi| | 2018-6-11 16:55 | 只看该作者
任一步都有可能出负数,你可以一步步看哪一步出了负值,比在这讨论强多了,说不定一开始读传感器就是负数。

使用特权

评论回复
29
潜力变实力| | 2018-6-11 20:16 | 只看该作者
仿真一下,看一下每个变量的值,清清楚楚,明明白白。

使用特权

评论回复
30
henangongda123|  楼主 | 2018-6-11 20:29 | 只看该作者
潜力变实力 发表于 2018-6-11 20:16
仿真一下,看一下每个变量的值,清清楚楚,明明白白。

嗯 就是在一步步仿真的时候发现这个地方异常的,等下继续仿真看看

使用特权

评论回复
31
henangongda123|  楼主 | 2018-6-11 20:52 | 只看该作者
为了仿真观察方便,我把a设置成了全局变量,并且有long变成unsigned long,赋初值为0(楼上有位兄台说的对,这个要养成好习惯,仿真的时候发现,不赋初值的话进入子涵数后会是一个随机初值),虽然没有负数了,但问题依旧没解决!a变成了一个巨大值,完全不是应该计算得到的值。。。

a变成巨大值.png (93.54 KB )

a变成巨大值.png

使用特权

评论回复
32
henangongda123|  楼主 | 2018-6-11 20:56 | 只看该作者
可以看到:a = (SHT31_R_Data[3]*256)+SHT31_R_Data[4];
a经过此句程序后变成了4294935527,实际这时候SHT31数据已经读取完毕,SHT31_R_Data[3]、SHT31_R_Data[4]值已经固定,正确的a应该是131*256+231=33767.

使用特权

评论回复
33
henangongda123|  楼主 | 2018-6-11 20:58 | 只看该作者
几乎是同样的算法,温度值就能正常(31),湿度值来个208!我也是无语了。。。现在按照其他网友建议的改改看。

数值.png (59.1 KB )

数值.png

使用特权

评论回复
34
henangongda123|  楼主 | 2018-6-11 21:04 | 只看该作者
按照楼主位的网友建议,加强制转换后OK了!哈哈

强制转换-1(错误).png (101.08 KB )

强制转换-1(错误).png

强制转换-2(正确).png (95.4 KB )

强制转换-2(正确).png

使用特权

评论回复
35
henangongda123|  楼主 | 2018-6-11 21:08 | 只看该作者
谢谢各位,问题解决了,呵呵,下一步准备用float类型,把温湿度小数位处理出来。

强制转换.png (105.02 KB )

强制转换.png

使用特权

评论回复
36
henangongda123|  楼主 | 2018-6-11 21:20 | 只看该作者
究其原因,还是自己的基本功不扎实啊,哎,就像这篇**写的那样:半路出家,现在反码、补码早忘的一干二净了

深入理解C语言类型转换.png (73.1 KB )

深入理解C语言类型转换.png

使用特权

评论回复
37
shauew| | 2018-6-12 10:02 | 只看该作者
henangongda123 发表于 2018-6-11 20:56
可以看到:a = (SHT31_R_Data[3]*256)+SHT31_R_Data[4];
a经过此句程序后变成了4294935527,实际这时候SHT3 ...

4294935527 = 0xFFFF83E7,
33767 = 0x83E7。
我只能帮你这么多了。

使用特权

评论回复
38
shauew| | 2018-6-12 10:05 | 只看该作者
本帖最后由 shauew 于 2018-6-12 10:06 编辑
shauew 发表于 2018-6-12 10:02
4294935527 = 0xFFFF83E7,
33767 = 0x83E7。
我只能帮你这么多了。

先不考虑强制转换问题,在重新使用a前为什么不先清0?

menu.saveimg.savepath20180612100422.jpg (80.52 KB )

menu.saveimg.savepath20180612100422.jpg

使用特权

评论回复
39
henangongda123|  楼主 | 2018-6-12 10:44 | 只看该作者
shauew 发表于 2018-6-12 10:05
先不考虑强制转换问题,在重新使用a前为什么不先清0?

清零没用的,我测试过,只是没截图

使用特权

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

本版积分规则