Linux 用户区应用中的I2C读取

Linux 用户区应用中的I2C读取,linux,linux-kernel,embedded-linux,i2c,Linux,Linux Kernel,Embedded Linux,I2c,I2c设备与OMAP L138相连,用于读取I2c数据。其中OMAP L138是主设备,i2c设备作为从设备,i2c设备发送2字节的数据。我可以使用ioctl()和read函数读取两个i2c数据字节。在第一次尝试中,我能够读取前两个字节,但在第二次尝试中,一个字节被丢弃,接下来的两个字节被读取。该结果在i2c设备的每次连续读取中重复。如何确保每次连续读取都应该读取每个字节而不删除任何一个字节 代码: void i2cread() { int i2c_fd; ssize_t b

I2c设备与OMAP L138相连,用于读取I2c数据。其中OMAP L138是主设备,i2c设备作为从设备,i2c设备发送2字节的数据。我可以使用ioctl()和read函数读取两个i2c数据字节。在第一次尝试中,我能够读取前两个字节,但在第二次尝试中,一个字节被丢弃,接下来的两个字节被读取。该结果在i2c设备的每次连续读取中重复。如何确保每次连续读取都应该读取每个字节而不删除任何一个字节

代码:

void i2cread()
{  
   int i2c_fd;  
   ssize_t byte;  
   char buffer[32];  

   i2c_fd=open("/dev/i2c-1",O_RDWR);  
   if(i2c_fd<0) {  
      printf("File I2C Device Can't be Opened\n");  
      return -1;  
   }  
   else {  
      printf("File I2C Device is Opened\n");  
   }  
   if(ioctl(i2c_fd,I2C_SLAVE,0x48)<0) {    
      printf("I2C Device Can't be Opened\n");    
      close(i2c_fd);    
      return -1;   
   }
   else {
      printf("I2C Device is Opened\n");
   }  
   byte=read(i2c_fd,buffer,2);  
   printf("%d. ",byte);  
   if(byte<0){  
      printf("\n");  
   }  
   else  {  
     for(byte=0;byte<2;byte++)  
        printf("%d ",buffer[byte]);  
     printf("\n");  
   }
}  
void i2cread()
{  
int i2c_fd;
ssize_t字节;
字符缓冲区[32];
i2c_fd=打开(“/dev/i2c-1”,O_RDWR);

if(i2c\u fd)不确定是否解决了问题,但您是否查看了?为什么在
i2cread()
打开(“/dev/i2c-1”)
?尝试打开一次,然后调用
i2cread()
两次,以便每次读取2个字节。读取时(i2c\u fd,缓冲区,2);两次未关闭,观察到一个字节仍被丢弃。我如何避免它?如果我将更改读取(i2c_fd,缓冲区,4);则我能够成功读取四个字节,并且再次尝试读取(i2c_fd,缓冲区,4);然后删除一个字节,然后读取下四个字节。原因可能是什么?有人能解释一下吗?刚刚在eeprom上尝试了这个方法,它工作正常。硬件可以信任吗?它是什么类型的设备?