读取 ADC(比格尔骨黑),而不关闭文件描述符

Read ADC (Beaglebone Black) without closing File Descriptor

本文关键字:文件 描述 ADC 比格尔 读取      更新时间:2023-10-16

是否可以在不关闭文件描述符的情况下读取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);
}

问题可能是read()更改了文件偏移量。尝试在读取后以 lseek(2) 查找回文件的开头,或使用 pread(2) 从偏移量 0 显式读取。– 超声刀