0

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

我之前用 select 试过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);
}
4

1 回答 1

0

问题可能是read()改变了文件偏移量。尝试使用 after reading 回溯到文件的开头lseek(2),或者使用pread(2)从偏移量 0 显式读取。 – Ulfalizer

于 2015-10-16T09:57:16.947 回答