2017-05-18 3 views
1

私はLSM6DSLと呼ばれるIMUセンサーをiioドライバとともに使用しています。私はコマンドを使用して、生の値を表示するなら、彼らは正常に動作:IIOデバイスのバッファは常にnull

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); 
} 

そして、これは次のとおりです。

cat /sys/bus/iio/devices/iio:device0/in_accel_x_raw 

は、それから私は、私はCプログラムから、これらすべての値を読み取ることができるようにlibiioを使用することにしました結果:

OK 
Error: Device or resource busy 

私に何か不足していますか?より多くの情報が必要な場合はお知らせください。

+1

理由は何ですか。アクセス許可の問題(ルートを使用してみますか?)からライブラリのバグになることができます。プログラム+ libiioをデバッグする必要があります( 'gdb'、' strace'または 'printf'トレースを追加するだけです)。 'iio_device_create_buffer()'を呼び出す前にブレークポイントを置いて、正確に '-EBUSY'エラーが発生する場所を見つけるまで、ステップダウンしてください。 libiioをデバッグするには、[debug symbols](https://wiki.debian.org/DebugPackage)を使用する必要があります。そこから私たちの助けが必要な場合は、libiioに '-EBUSY'が設定されている正確なコード行について言及してください。 –

+0

また、libiioのソースを 'EBUSY'という単語でgreppingするのは良い考えです。このエラーが 'open()'や 'fopen()'のようにsyscall/libc関数ではなくlibiio関数によって返されたとすれば、何が起こっているのかが分かります。 –

+1

@SamProtsenko、btw、あなたが犯人行を見つけるのに使うことができるトリックがあります。つまり、 '#undef EINVAL; #define EINVAL __LINE__'。多分私はそれについての記事を書く必要があります:-) – 0andriy

答えて

1

私は答えを見つけたと思うし、ncursesライブラリの効果には注意を払っていませんでした(私が使っているとは申し訳ありません)。

これらの機能をncursesの初期化の前に移動しましたが、バッファが正常に作成されました。

+0

良いことは、問題の根本原因が見つかりました。あなたの答えを受け入れてください。 –

+0

こんにちは、Stackoverflowは私が20時間でそうすることができると言います! – ynitsed