嵌入式linux环境取得U盘容量等信息的方法

4412开发板linux环境取得U盘容量等信息的方法

 

环境:讯为4412开发板 liunx系统 QT5.7.0

实现方法:

1、执行linux的df命令,得到开发板U盘设备文件的挂载点:“/mnt/usbdisk/sda1”。

2、通过statfs函数取得U盘的磁盘容量信息。

3、建立QT Widgets Application工程,添加1个“pushButton”和3个“label”组件,添加“pushButton”的click槽函数,在该函数中实现具体功能,详细参考如下代码。

 

主要实现代码:

#define USB_DISK_ARM_PATH    "/mnt/usbdisk/sda1"

void MainWindow::on_pushButton_clicked()

{

    /* get usb disk size */

    struct statfs Udisk;

    quint64     usedBytes = 0;

    quint64     freeBytes = 0;

    quint64     totalBytes = 0;

    quint64     endSpace = 0;

 

    if (statfs(USB_DISK_ARM_PATH, &Udisk) == -1){

        return;

     }

 

    totalBytes = (quint64)Udisk.f_blocks * (quint64)Udisk.f_frsize;

    freeBytes = (quint64)Udisk.f_bfree * (quint64)Udisk.f_frsize;

    usedBytes = (quint64)(totalBytes - freeBytes);

    

    totalBytes = totalBytes/1024;

    freeBytes = usedBytes/1024;     

    usedBytes = freeBytes/1024;

 

ui->label1->setText(QString::number(totalBytes, 10));

ui->label2->setText(QString::number(totalBytes, 10));

ui->label3->setText(QString::number(totalBytes, 10));

}

 

----------------------------------------------

备注:

1、df命令显示内容详解

root@ubuntu:/home/my# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/root               957496    312908    644588  33% /

tmpfs                   827268         0    827268   0% /dev/shm

/dev/sda1             15633392    600440  15032952   4% /mnt/usbdisk/sda1

 

df命令每一列显示内容的含义

第1列:设备文件系统所在的路径

第2列:磁盘的总容量,单位为1K字节

第3列:磁盘已经使用的容量

第4列:磁盘的剩余容量

第5列:磁盘已经使用的空间占据总容量的百分比

第6列:磁盘的挂载点名称

 

2、statfs函数详解

int statfs(const char *path, struct statfs *buf)

path:文件系统的文件路径名(不是设备名,是挂载点名称)      
buf:statfs结构体的指针变量,用于储存文件系统的相关信息

 

返回值: 成功执行时,返回0。失败返回-1

需要的头文件:#include <sys/statfs.h> 

3、statfs结构体

struct statfs {

long f_type;    /* 文件系统类型 */

long f_bsize;   /* 经过优化的传输块大小 */

long f_blocks;  /* 文件系统数据块总数 */

long f_bfree;   /* 可用块数 */

long f_bavail;  /* 非超级用户可获取的块数 */

long f_files;   /* 文件结点总数 */

long f_ffree;   /* 可用文件结点数 */

fsid_t f_fsid;  /* 文件系统标识 */

long f_namelen; /* 文件名的最大长度 */

};

-------------------------------------------------

Linux读取U盘或者移动硬盘序列号并获取U盘或者移动硬盘分区名。基本原理如下: 当有外置 USB 插入的时候,会产生 /proc/scsi/usb-storage 目录,并在其中产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。 相应的 /sys/class/scsi_device/ 目录中会有 scsi 设备的目录(ide 硬盘默认无子目录,sata硬盘默认有子目录),以数字开头(形如 1:0:0:0 2:0:0:0) 这个数字与前面 /proc/scsi/usb-storage目录中的相对应,子目录表示sata硬盘。比如 /sys/class/scsi_device/2:0:0:0/device/block 中有USB设备,从该目录下得到U盘或者移动硬盘的分区名,比如sda1。 该demo实现了上述过程,先检查 /proc/scsi/usb-storage 目录,看是否有u盘或者移动硬盘接入,如果有则读取u盘或者移动硬盘的序列号,然后在/sys/class/scsi_device/目录下逐级查找,直到找到u盘或者移动硬盘的分区。 完整代码,可直接编译和测试,嵌入式环境下也是适应的。 在linux测试如下,id表示序列号,sdb1表示是分区名称: # ./a.out udisk dev num:0 udisk id:055CE21B ret:0 dev num:0 found dir:0:0:0:1 found dev dir:0:0:0:1,full path:/sys/class/scsi_device/0:0:0:1 sub founction found dir:sda found sd device dir:sda,full path:/sys/class/scsi_device/0:0:0:1/device/block/sda found dir:0:0:0:2 found dev dir:0:0:0:2,full path:/sys/class/scsi_device/0:0:0:2 sub founction found dir:sdb found sd device dir:sdb,full path:/sys/class/scsi_device/0:0:0:2/device/block/sdb found sd sub device dir:sdb1 found dir:0:0:0:0 found dev dir:0:0:0:0,full path:/sys/class/scsi_device/0:0:0:0 sub funciton Open Directory /sys/class/scsi_device/0:0:0:0/device/block Error:No such file or directory get name return:0,disk name:sdb1 # 因为有的USB设备会有好几个,比如把CD和U盘集成到一起,就会出现上面的情况,有多个子目录去查找。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值