在不关闭文件描述符的情况下读取ADC(Beaglebone Black)

时间:2015-04-28 11:02:10

标签: c++ embedded-linux beagleboneblack adc iio

是否可以在不关闭文件描述符的情况下读取Beaglebone Black或其他嵌入式Linux系统的ADC?

我在read()之前选择了一个。 select()返回1,但read()在第一次迭代后返回0,因此我无法获取任何数据。有任何想法吗?关闭和打开文件描述符是否需要大量的CPU能力?

我的代码:

 #include<iostream>
 #include<fstream>
 #include<string.h>
 #include<sstream>
 #include<fcntl.h>
 #include<unistd.h>
 #include<sys/select.h>
 #include <sys/time.h>

 using namespace std;

 #define LDR_PATH "/sys/bus/iio/devices/iio:device0/in_voltage"

 int main(int argc, char* argv[]){
 int number = 1;
 int AdcConnection = 0;

stringstream AdcPath;
AdcPath << LDR_PATH << number << "_raw";


AdcConnection = open(AdcPath.str().c_str(),O_RDONLY |O_NONBLOCK);

 if (AdcConnection <0)
 {
perror("UART: Failed to open the file.\n");
close(AdcConnection);
return -1;
 }

 fd_set fdsAdcRead;
 struct timeval timeout = {5, 0};

 unsigned char receive[5];
 int FlagRead = -1;
 int FlagSelect = -1;

while (1)
{
 FD_ZERO(&fdsAdcRead); //clear the file descriptor
 FD_SET(AdcConnection,&fdsAdcRead); //Set the descriptor

 FlagSelect = select(AdcConnection+1,&fdsAdcRead,NULL,NULL,&timeout);//check if data are available

if (FlagSelect <0)
{
     perror("Failed to check if data are available.\n");
     close(AdcConnection);
     return -1;
}
else if (FlagSelect ==0)
{
    cout << "There were no Data" << endl;
    timeout.tv_sec = 5;
}
else
{
 memset(&receive,0,sizeof(receive));
 FlagRead = read(AdcConnection, (void*)receive, 5);
 cout << receive << endl << FlagRead << FlagSelect << endl;
 timeout.tv_sec = 5;
}


 usleep(1000000);
}

1 个答案:

答案 0 :(得分:0)

问题可能是read()更改了文件偏移量。尝试在阅读后使用lseek(2)回到文件的开头,或使用pread(2)明确地从偏移0读取。 - Ulfalizer