0

Is it possible to read the ADC of a Beaglebone Black or another embedded-linux system without closing the File descriptor?

I tried it with a select before read(). select() returns 1, but read() returns 0 after the first iteration and therefore I can't get any data. Any ideas? Does closing and opening of the file descriptor requires a lot of CPU power?

My code:

 #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);
}
Sam Protsenko
  • 14,045
  • 4
  • 59
  • 75
ben
  • 207
  • 1
  • 10
  • The problem is probably that `read()` changes the file offset. Try seeking back to the beginning of the file with `lseek(2)` after reading, or use `pread(2)` to explicitly read from offset 0. – Ulfalizer Apr 28 '15 at 11:20
  • That's assuming it's a 5-byte file though. I don't know what the format is. – Ulfalizer Apr 28 '15 at 11:24

1 Answers1

0

The problem is probably that read() changes the file offset. Try seeking back to the beginning of the file with lseek(2) after reading, or use pread(2) to explicitly read from offset 0. – Ulfalizer

Armali
  • 18,255
  • 14
  • 57
  • 171