Драйвер Android Things I2C PioException: ошибка ввода-вывода

Здравствуйте дорогие пионеры Android вещей!

Я обращаюсь к вам за помощью, поскольку последние пару месяцев я пытался создать драйвер Android для датчика температуры и влажности Adafruit SI7021. Вот ссылка на репозиторий github, на котором размещен проект. Подключение и получение идентификатора чипа с помощью readRegByte работают нормально. Но я получаю PioException: I/O error при попытке получить данные о температуре или влажности с помощью readRegBuffer.

int address = 0xE5; // from datasheet
byte[] buffer = new byte[3];

device.readRegBuffer(address, buffer, 3); // throws PioException

Я не знаю, какую еще подсказку я могу дать вам, чтобы получить четкое представление о проблеме, поэтому не стесняйтесь задавать любые вопросы.

Пожалуйста, не заставляйте меня покупать ардуино и начинать все сначала ;)

Большое спасибо!

PS: используйте простые слова, я новичок в IoT и Android.


person Birdybix    schedule 06.12.2017    source источник
comment
Добро пожаловать в StackOveerflow. Пожалуйста, посетите tour ... Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для ее воспроизведения в самом вопросе. - в других случаях они не по теме.   -  person Selvin    schedule 06.12.2017
comment
Хорошо, я добавил часть кода с ошибками. Лучше?   -  person Birdybix    schedule 06.12.2017
comment
Вы пытались читать без режима удержания (0xF5)?   -  person Selvin    schedule 06.12.2017
comment
Ты прав! Я не могу поверить, что я пробовал так много вещей, но это! Я понятия не имею, почему. Потому что в драйвере c используется адрес в режиме удержания. Спасибо.   -  person Birdybix    schedule 07.12.2017


Ответы (1)


readRegBuffer не делает того, что, как я полагаю, вы ожидаете. Из [документации по API](https://developer.android.com/things/reference/com/google/android/things/pio/I2cDevice.html#readRegBuffer(int, byte[], int)):

Чтение нескольких байтов из заданного регистра.

Этот метод будет использоваться, если регистр, который вы хотите прочитать, имеет длину 3 байта (24 бита). Просматривая техническое описание детали (стр. 21), зарегистрируйтесь 0xE5 для относительной влажности представляется 2-битным словом.

Ожидание 3 байтов создаст проблему, так как ваше устройство будет ожидать возврата 3 байтов. Однако, если возвращаются только два байта, фактический результат будет несогласованным.

person Nick Felker    schedule 06.12.2017
comment
Вы также правы. Сначала я попробовал 3, потому что использовал пример из сенсора BPM280. Тогда я подумал, что было бы полезно получить контрольную сумму (не знаю, поможет ли это). Так что 3 не глючит, а возвращает фальшивые данные. Я попробовал 2, я получаю согласованные данные о влажности. Что касается температуры, я дул на датчик больше минуты, и он почти не двигался... В любом случае, я выложил новую версию на github, если вы когда-нибудь захотите ее попробовать. Большое тебе спасибо - person Birdybix; 07.12.2017
comment
Каждый тип периферии отличается. Даже если оба поддерживают I2C, количество байтов и адреса регистров будут разными. Обязательно прочитайте техническое описание, это поможет определить любые крайние случаи для поддерживаемого вами устройства. - person Nick Felker; 07.12.2017