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()ファイル オフセットを変更することです。lseek(2)after reading を使用してファイルの先頭にシークするかpread(2)、オフセット 0 から明示的に読み取るために使用してください。 – Ulfalizer

于 2015-10-16T09:57:16.947 に答える