J'utilise un capteur IMU appelé LSM6DSL avec les pilotes iio. Ils fonctionnent très bien si j'affiche les valeurs brutes avec la commande:Le tampon de périphérique IIO est toujours nul
cat /sys/bus/iio/devices/iio:device0/in_accel_x_raw
Puis j'ai décidé d'utiliser le libiio pour que je puisse lire toutes ces valeurs d'un programme C:
struct iio_context *context = iio_create_local_context();
struct iio_device *device = iio_context_get_device(context, 1);
struct iio_channel *chan = iio_device_get_channel(device, 0);
iio_channel_enable(chan);
if (iio_channel_is_scan_element(chan) == true)
printf("OK\n");
struct iio_channel *chan2 = iio_device_get_channel(device, 1);
iio_channel_enable(chan2);
struct iio_buffer *buff = iio_device_create_buffer(device, 1, true);
if (buff == NULL)
{
printf("Error: %s\n", strerror(errno));
return (1);
}
Et c'est la résultat:
OK
Error: Device or resource busy
Ai-je raté quelque chose? Faites-moi savoir si vous avez besoin de plus d'informations.
Il est difficile de dire quelle est la raison. Peut-être quelque chose de problème d'autorisations (essayez d'utiliser root?) À la bibliothèque bug. Vous devriez déboguer votre programme + libiio (en utilisant 'gdb',' strace' ou simplement ajouter des traces 'printf'). Mettez simplement un point d'arrêt avant d'appeler le 'iio_device_create_buffer()' et descendez jusqu'à ce que vous trouviez exactement l'erreur '-EBUSY'. Vous devrez peut-être utiliser [symboles de débogage] (https://wiki.debian.org/DebugPackage) pour déboguer libiio. Si vous avez besoin de notre aide à partir de là - lancer une mise à jour ici, en mentionnant la ligne de code exacte où '-EBUSY' est défini dans libiio. –
Aussi, grepping les sources de libiio par le mot «EBUSY» est une bonne idée. En supposant que cette erreur a été renvoyée par la fonction libiio et non par la fonction syscall/libc, comme 'open()' ou 'fopen()', vous pouvez avoir une bonne idée de ce qui se passe. –
@SamProtsenko, btw, il y a une astuce que vous pouvez utiliser pour trouver la ligne coupable, c'est-à-dire '#undef EINVAL; #define EINVAL __LINE__'. Peut-être que je dois écrire un article à ce sujet :-) – 0andriy