注册 登录
查看: 366|回复: 9

关于数据类型uchar和uint16的的一个奇怪问题,求解!

[复制链接]
发表于 2014-11-7 15:31:24 | 显示全部楼层 |阅读模式
这两个数据类型,我在头文件中是这样定义的:
#define  uchar   unsigned char
typedef  unsigned int   uint16;
但是在使用过程中遇到一个莫名其妙的问题。问题是这样的:
我在编写一个DS18B20的数据写入函数,函数如下:

/************************************************************************
时 间:2014年11月6日 18:48:37
功 能:往DS18B20写入一个字节的数据
参 数:Data为写入的数据
*************************************************************************/
void DS18B20_WriteByte(uchar Data)
{
// uchar i,j;   //使用这种数据类型,数据传输将会出问题,导致数据无法显示
    uint16 i,j;
for(i=0;i<8;i++)    //一个字节有8位,一位一位进行写入
{
  //根据时序图,首先把总线拉低 1 us
  DS18B20_IO = 0;
  _nop_();             //延时1us
  
  //然后开始写入数据,从最低位开始写入
  DS18B20_IO = Data & 0x01;
  
  //根据时序图,接下来至少要延时60us
  j = 8;
  while(j)
  {
   j--;
  }
  
  //最后释放总线
  DS18B20_IO = 1;
  
  //至少延时1us给总线恢复时间才能接着写入第二位数据
  //在这个延时时间内,正好可以用来处理其他事项
  Data >>= 1;     //Data右移1位,以便写入第二位数据
}

}



最后发现,使用“uchar i,j;”时数据传输发生错误,导致数据无法显示。
而使用“uint16 i,j;”时,一切正常。仅仅是一词之差,何以出现这么大的差别,求解!!!!
还望大神不吝赐教!





回复

使用道具 举报

 楼主| 发表于 2014-11-7 15:33:52 | 显示全部楼层
本来想用那个插入代码功能是帖子看起来整洁一些,但是不知道为什么,插入不了,所以就这样发了,可能有点不太方便阅读,还望各位见谅
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-7 15:37:08 | 显示全部楼层
typedef  unsigned int   uint16;


这种定义不好,一般是:
typedef  unsigned short int   uint16;

因为int类型有可能是32位。

可能的原因在于延时时间,32位的处理时间比8位长
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-7 15:40:47 | 显示全部楼层
山外メ雲ジ 发表于 1415345828
typedef  unsigned int   uint16;


这种定义不好,一般是:
typedef  unsigned short int   uint16;

因为int类型有可能是32位。

可能的原因在于延时时间,32位的处理时间比8位长
嗯,受教了!还真有可能是这个原因,我试试看
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-7 15:43:05 | 显示全部楼层
草原上的星星 发表于 1415345632
本来想用那个插入代码功能是帖子看起来整洁一些,但是不知道为什么,插入不了,所以就这样发了,可能有点不太方便阅读,还望各位见谅
PC客户端,需要手动写格式进去。代码前加[code_],代码后加   [/code_] ,两个符号里面的 _ 需要删掉(我这里加进去是避免论坛 识别为代码格式)
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-7 15:56:18 | 显示全部楼层
山外メ雲ジ 发表于 1415346185
PC客户端,需要手动写格式进去。代码前加[code_],代码后加   [/code_] ,两个符号里面的 _ 需要删掉(我这里加进去是避免论坛 识别为代码格式)
嗯,以后就这么用
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-7 15:58:42 | 显示全部楼层
山外メ雲ジ 发表于 1415345828
typedef  unsigned int   uint16;


这种定义不好,一般是:
typedef  unsigned short int   uint16;

因为int类型有可能是32位。

可能的原因在于延时时间,32位的处理时间比8位长
刚刚测试了下,果真如你所说。听君一席话,胜读十年书啊。要不然我还在为找不着问题所在而郁闷着呢,非常感谢
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-7 16:07:03 | 显示全部楼层
草原上的星星 发表于 1415347122
刚刚测试了下,果真如你所说。听君一席话,胜读十年书啊。要不然我还在为找不着问题所在而郁闷着呢,非常感谢
硬件调试,经常遇到这问题,时间太快,模块反应不过来,得加延时
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-7 18:05:21 | 显示全部楼层
时序时间问题,山外哥厉害啊,一眼看出。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-8 00:43:39 | 显示全部楼层
山外哥真厉害啊
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回列表 返回顶部