2722|8

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

哪位大侠来帮我看看下面的程序! [复制链接]

  我在2410linux下面运行通过read()、write()接口和O_RDWR IOCTL读写I2C设备的程序:
#include
  #include
  #include
  #include
  #include
  #include
  #include
  
  #define I2C_RETRIES     0x0701
#define I2C_TIMEOUT     0x0702
#define I2C_SLAVE       0x0703
#define I2C_DEV        "dev/i2c-0"
int main(int argc, char **argv)
{
   unsigned int fd;
   unsigned short mem_addr;
   unsigned short size;
   unsigned short idx;
   #define BUFF_SIZE    32
   char buf[BUFF_SIZE];
   char cswap;
   union
   {
    unsigned short addr;
     char bytes[2];
   } tmp;


if (argc < 3)
  {
     printf("Use:\n%s /dev/i2c-x mem_addr size\n", argv[0]);
     return 0;
   }
   sscanf(argv[2], "%d", &mem_addr);
  sscanf(argv[3], "%d", &size);


   if (size > BUFF_SIZE)
     size = BUFF_SIZE;

   fd = open(argv[1], O_RDWR);

   if (!fd)
   {
     printf("Error on opening the device file\n");
     return 0;
   }

   ioctl(fd, I2C_SLAVE, 0x50); /* 设置eeprom地址 */
   ioctl(fd, I2C_TIMEOUT, 1); /* 设置超时 */
   ioctl(fd, I2C_RETRIES, 1); /* 设置重试次数 */

   for (idx = 0; idx < size; ++idx, ++mem_addr)
   {
     tmp.addr = mem_addr;
     cswap = tmp.bytes[0];
     tmp.bytes[0] = tmp.bytes[1];
     tmp.bytes[1] = cswap;
     write(fd, &tmp.addr, 2);
     read(fd, &buf[idx], 1);
   }
   buf[size] = 0;
  close(fd);
   printf("Read %d char: %s\n", size, buf);
   return 0;
}
我的执行程序为a.out,在目标级上运行后提示:./.out /dev/i2c-x mem_addr size然后就程序退出,高手帮我找找问题所在好吗?

最新回复

我在shell下输入命令# ./a.out /dev/i2c-0 5 10 结果是:Read 10 char: ?                  奇怪了,为什么没法读取呢? 还有这句: #define BUFF_SIZE    32 是定义字节数还是定义的数据类型是32位的啊?如果只是规定字节数那为什么我写入的数据读不出来呢?还是我根本就没有写入成功啊?  详情 回复 发表于 2008-11-27 15:21
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
if (argc < 3)
  {
    printf("Use:\n%s /dev/i2c-x mem_addr size\n", argv[0]);
    return 0;
  }
  sscanf(argv[2], "%d", &mem_addr);
  sscanf(argv[3], "%d", &size);
还有上面这几句,
if (argc < 3) 这个条件是针对谁的呢?
printf("Use:\n%s /dev/i2c-x mem_addr size\n", argv[0]); 这句是想提醒我什么呢?
sscanf(argv[2], "%d", &mem_addr);
  sscanf(argv[3], "%d", &size);
这两句的值又是在哪儿取呢?希望高手能帮帮我
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
需要输入参数,也就是命令行参数。提示的是程序的使用方法,好像是缺少I2C寄存器地址和读取字节数吧。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
up
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

5
 
sscanf(argv[2], "%d", &mem_addr);
  sscanf(argv[3], "%d", &size);
这两句应该是把argv[2]和argv[3]的值分别赋予mem_addr和size吧,argv[2],argv[3]的值是多少呢?
三楼的,I2C寄存器地址和读取字节数在哪儿设置呢?或者说这程序应该怎么改呢?
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

6
 
晕  程序不用改。

上面提示的正是需要你在运行程序时命令行(也是就是shell下面)输入的参数及格式。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
  可是我一运行就提示:运行后提示:./.out /dev/i2c-x mem_addr size然后就程序退出了啊,这会是什么原因呢?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

8
 
而且我用的是sscanf,应该不是通过键盘直接赋值吧
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
我在shell下输入命令# ./a.out /dev/i2c-0 5 10
结果是:Read 10 char: ?
                
奇怪了,为什么没法读取呢?
还有这句: #define BUFF_SIZE    32
是定义字节数还是定义的数据类型是32位的啊?如果只是规定字节数那为什么我写入的数据读不出来呢?还是我根本就没有写入成功啊?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表