Napisałem to 19 godzin temu, kiedy pomyślałem, że mam naprawę dla problemu IOError: ........................... ..................................................
Byłem nękany tym samym błędem wejścia/wyjścia podczas korzystania z bus.write_byte rozmawiającego z Arduino. Próbowałem naprawić i2cdetect Jona, ale odkryłem, że do tego czasu w kodzie zostały uszkodzone, złe numery zostały już dostarczone do Arduino i jakoś go wyłączyły.
Co zrobił praca została resetowania baudrate I2C, stosując
sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=100010
Po tym nie więcej błędów I/O !! Byłbym bardzo zainteresowany teoriami na temat tego, co może powodować tę widoczną niezgodność szybkości transmisji. Mam nadzieję że to pomoże!
.............................................. ...................................
Po wielu testach odkryłem, że szybkość transmisji sprawiła, że tempo błędów spadło, ale nie wyeliminowało ich.
Teraz wydaje się jasne, że wywołanie i2cdetect Jona zastosowane zaraz po błędzie zainicjuje RPi, aby mogło być kontynuowane. Ale musisz także poradzić sobie z tym, że złe dane zostały prawdopodobnie wysłane do Arduino i musisz to wykryć i naprawić, a także ponownie zainicjować Wire (a w moim przypadku sterownik servo), tak, że nawet jeśli Pi ma błąd , że dane będą nadal dostępne i będą możliwe do wykorzystania. Mam nadzieję że to pomoże.
Ten błąd nadal występuje. Wydaje się, że jest przypadkowa, kiedy się pojawia. Czasem się to zdarzy i polecenie będzie nadal wysyłane, innym razem nie. Czy może to być spowodowane zakłóceniami? Myślałem, że smbus musi otrzymywać potwierdzenie z urządzenia slave, w przeciwnym razie nie będzie błędu, gdy polecenie zostanie odebrane pomyślnie (więc potwierdzenie jest zakłócane powodując błąd). W przeciwnym razie transmisja jest zakłócana, a więc niewolnik nie wysyła odpowiedniego potwierdzenia. – holmeswatson
Mam ten sam problem ... – otmezger
Nie znalazłem rozwiązania tego problemu, chociaż myślę, że jest spowodowane przez zegar przekrzywienie, więc zmniejszenie szybkości I2C na RaspberryPi może pomóc, chociaż wszystkie implementacje tego wydają się trochę nieporządne. Czasami polecenia przechodzą, ale moduł nadal błędy, a czasem polecenie nie przechodzi i błędy. W związku z tym ustawiłem próbę systemu catch, który próbuje ponownie wysłać polecenie, jeśli wystąpił błąd. Za pomocą tych pakietów wysyłam dwubajtowy numer pakietu.Jeśli Rainbowduino ma już akcję tego pakietu/polecenia, to ją ignoruje, daj mi znać, jeśli potrzebujesz kodu – holmeswatson