Buena tarde,
Estoy ejecutando un bucle simple para comprobar si se ha insertado o extraído la tarjeta SD, pero parece que no funciona correctamente todo el tiempo.
El problema es que, cuando el programa se inicia con la tarjeta SD insertada, la instrucción if(f.good()) es True .
Cuando se extrae la tarjeta SD, esta declaración es falsa .
Sin embargo, cuando se vuelve a insertar la tarjeta SD, esta afirmación sigue siendo Falsa .
¿Existe una forma más confiable en C ++ para detectar la presencia de la tarjeta SD? Estoy ejecutando Linux Yocto, basado en OpenEmbedded. Preferiría evitar el uso de bibliotecas externas y usar archivos IO o llamadas al sistema si es posible.
Gracias.
Mi bucle se muestra a continuación,
while (running) { ifstream f("/dev/mmcblk1"); if (f.good()) { f.close(); if (!mounted) { system("mount /dev/mmcblk1p1 /mnt/Storage"); mounted = true; } sdPresent = true; } else { f.close(); sdPresent = false; mounted = false; } std::this_thread::sleep_for(std::chrono::milliseconds(500)); }La forma directa adecuada de saber si un dispositivo extraíble tiene un medio insertado es leer el tamaño del dispositivo de sysfs .
En su caso, estaría en algún lugar como /sys/block/mmcblk1/size . Ese archivo debe existir siempre y contener un valor unsigned long long . Si es 0 , entonces no hay medios; si es >0 , entonces tiene un medio de ese tamaño.
bool has_media() { std::ifstream fsize("/sys/block/mmcblk1/size"); unsigned long long size; return (fsize >> size) && (size > 0); }Si, en lugar de sondear y dormir, desea recibir notificaciones adecuadas de la inserción/eliminación de medios, y no desea/no puede usar libudev, entonces necesitará usar uevent y un socket de enlace de red. Vea esta excelente respuesta con los detalles.
si la tarjeta SD es la única partición FAT32, simplemente puede hacer:
fdisk -l | grep FAT32 | cut -c 1-8