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

[复制链接]
6127|41
 楼主| henangongda123 发表于 2018-6-11 14:50 | 显示全部楼层
一叶倾城wwq 发表于 2018-6-11 14:30
抱歉楼主,刚才的回复我没仔细看你的程序,现在我个人而言是你的同一个缓冲区(变量)重复使用,没有清空导 ...

好的 晚上我验证一下您的建议。
 楼主| henangongda123 发表于 2018-6-11 14:50 | 显示全部楼层
XZL 发表于 2018-6-11 14:36
应该定义成无符号数据

嗯 嗯
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的数。
 楼主| henangongda123 发表于 2018-6-11 16:14 | 显示全部楼层
chongdongchen 发表于 2018-6-11 16:09
楼主目前的问题是为什么定义成long就不行了??
分析1楼数据:27470 = 0x6B * 256 + 0x4E。
把编译器强制转 ...

数组是uchar型哦
chongdongchen 发表于 2018-6-11 16:16 | 显示全部楼层

uchar类型范围是0-255

评论

你可能没看懂我说的意思吧  发表于 2018-6-11 16:21
 楼主| henangongda123 发表于 2018-6-11 16:35 | 显示全部楼层
chongdongchen 发表于 2018-6-11 16:16
uchar类型范围是0-255

还真没有,另外我没有使用中断功能。
一叶倾城wwq 发表于 2018-6-11 16:38 | 显示全部楼层
henangongda123 发表于 2018-6-11 14:50
好的 晚上我验证一下您的建议。

嗯,楼主试试,不行再讨论
xuyaqi 发表于 2018-6-11 16:55 | 显示全部楼层
任一步都有可能出负数,你可以一步步看哪一步出了负值,比在这讨论强多了,说不定一开始读传感器就是负数。
潜力变实力 发表于 2018-6-11 20:16 | 显示全部楼层
仿真一下,看一下每个变量的值,清清楚楚,明明白白。
 楼主| henangongda123 发表于 2018-6-11 20:29 | 显示全部楼层
潜力变实力 发表于 2018-6-11 20:16
仿真一下,看一下每个变量的值,清清楚楚,明明白白。

嗯 就是在一步步仿真的时候发现这个地方异常的,等下继续仿真看看
 楼主| henangongda123 发表于 2018-6-11 20:52 | 显示全部楼层
为了仿真观察方便,我把a设置成了全局变量,并且有long变成unsigned long,赋初值为0(楼上有位兄台说的对,这个要养成好习惯,仿真的时候发现,不赋初值的话进入子涵数后会是一个随机初值),虽然没有负数了,但问题依旧没解决!a变成了一个巨大值,完全不是应该计算得到的值。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 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.
 楼主| henangongda123 发表于 2018-6-11 20:58 | 显示全部楼层
几乎是同样的算法,温度值就能正常(31),湿度值来个208!我也是无语了。。。现在按照其他网友建议的改改看。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| henangongda123 发表于 2018-6-11 21:04 | 显示全部楼层
按照楼主位的网友建议,加强制转换后OK了!哈哈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| henangongda123 发表于 2018-6-11 21:08 | 显示全部楼层
谢谢各位,问题解决了,呵呵,下一步准备用float类型,把温湿度小数位处理出来。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| henangongda123 发表于 2018-6-11 21:20 | 显示全部楼层
究其原因,还是自己的基本功不扎实啊,哎,就像这篇**写的那样:半路出家,现在反码、补码早忘的一干二净了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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。
我只能帮你这么多了。
shauew 发表于 2018-6-12 10:05 | 显示全部楼层
本帖最后由 shauew 于 2018-6-12 10:06 编辑
shauew 发表于 2018-6-12 10:02
4294935527 = 0xFFFF83E7,
33767 = 0x83E7。
我只能帮你这么多了。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| henangongda123 发表于 2018-6-12 10:44 | 显示全部楼层
shauew 发表于 2018-6-12 10:05
先不考虑强制转换问题,在重新使用a前为什么不先清0?

清零没用的,我测试过,只是没截图
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部