2017-05-18 6 views
1

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.

+1

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. –

+0

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. –

+1

@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

Répondre

1

Je suppose que j'ai trouvé la réponse, et je n'ai pas fait attention aux effets de la bibliothèque ncurses (désolé de ne pas mentionner que je l'utilisais).

J'ai déplacé ces fonctions avant l'initialisation de ncurses et maintenant le tampon est créé avec succès.

+0

Bonne chose est que vous avez trouvé la cause du problème. Allez-y et acceptez votre réponse. –

+0

Salut, Stackoverflow dit que je serai en mesure de le faire en 20 heures! – ynitsed