aju_cor Napisano Grudzień 21, 2014 Zgłoś Udostępnij Napisano Grudzień 21, 2014 Witam! Próbuję zmontować komunikację z układem FTDI FT232R z poziomu Androida. Finalnie mam problem z funkcją setFlowControl zwracającą false... Poniżej framgment funkcji OpenFTDI, która zwraca wartość 6 w przypadku gdy sterowanie przepływem jest ustawiona na FT_FLOW_NONE or XON_XOFF. W przypadku, gdy ustawię na FT_FLOW_DTR_DSR or RTS_DTR funcja pracuje prawidłowo. Próbowałem z różnymi niższymi prędkościami typu 9600 etc, bez skutku... int OpenFTDI() throws IOException { int index = 0; int result = -1; boolean result_bl = false; //------------------------------------ // Get FT_Device and Open the port ftD2xx = D2xxManager.getInstance(this); DevCount = ftD2xx.createDeviceInfoList(this); if (DevCount > 0) { ftDev = ftD2xx.openByIndex(this, index); // Configure the port to UART if (ftDev.isOpen() == true) { // Reset FT Device result_bl = ftDev.setBitMode((byte) 0, D2xxManager.FT_BITMODE_RESET); if (result_bl == true) { // Set Baud Rate result_bl = ftDev.setBaudRate(230400); if (result_bl == true) { // Set Data Bit , Stop Bit , Parity Bit result_bl = ftDev.setDataCharacteristics(D2xxManager.FT_DATA_BITS_8, D2xxManager.FT_STOP_BITS_1, D2xxManager.FT_PARITY_NONE); if (result_bl == true) { // Set Flow Control result_bl = ftDev.setFlowControl(D2xxManager.FT_FLOW_NONE, (byte) 0x0b, (byte) 0x0d); if (result_bl == true) { result = 0; //port has been openeed & configured OK } else { result = 6; } } else { result = 5; } } else { result = 4; } } else { result = 3; } } else { result = 2; } } else { result = 1; } return (result); } Co dalej ??? dlaczego nie mogę ustawić sterowania na NONE? Całość testuję na Androidzie 4.4 Pozdrawiam! Sławek Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Bartosz Wójcik Napisano Grudzień 22, 2014 Zgłoś Udostępnij Napisano Grudzień 22, 2014 A czy z poziomu NIE Androida działa? Czy flow mode nie kłóci się z charakterystyką przesyłania danych? Sprawdź kolejność wywoływania funkcji, tzn. spróbuj ustawić flow przed ustawianiem bit mode. Zobacz też źródło pod: https://github.com/ksksue/Android-FTDI-UART-Sample/blob/master/src/com/ksksue/app/ftdi_uart/MainActivity.java Trochę inaczej to inicjalizują, także w trybie flow none. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
aju_cor Napisano Grudzień 22, 2014 Autor Zgłoś Udostępnij Napisano Grudzień 22, 2014 Witam! Dzięki za szybką odpowiedź. Dla wyjasnienia: 1. Oczywiście, mam zrobioną komunikację PC <> FT232RL, działa bez problemów Co więcej, uruchomiłem terminal androidowy, ściągnięty ze strony FTDI - wszytsko działa. 2. Próby z kolejnością wywoływania poszczególnych funkcji już wcześniej robiłem - zawsze ten sam rezultat - SetFlowControl zwraca false... 3. Pod podanym powyżej linkiem, funkcja SetConfig robi to co ja... tylko oni nie sprawdzają rezultatu :) Popróbuję jeszcze i dam znać. P.S. 3 tygodnie temu zadałem pytanie z tym problemem, na oficjalny support FTDI - do tej pory nie mam odpowiedzi. Będę ich nękał dalej :), chyba ze wcześniej odkryję błąd :) Pozdrowienia. Sławek Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Bartosz Wójcik Napisano Grudzień 22, 2014 Zgłoś Udostępnij Napisano Grudzień 22, 2014 Skoro działa na PC bez problemów to prawdopobodnie coś nie jest tak od strony Androida, sprawdź drivery dla której wersji Androida zostały stworzone, może masz zbyt nowego :) Istnieje jeszcze jedna opcja, dekompilacja tych komponenetów np. korzystając z AndroChef-a i sprawdzenie co dokładnie kryje się w SetFlowControl, przepisanie tego (o ile możliwe) i wychwycenie błędów. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
aju_cor Napisano Grudzień 22, 2014 Autor Zgłoś Udostępnij Napisano Grudzień 22, 2014 Witam ponownie... Własnie dostałem dopowiedż z FTDI: "I just checked our bug database and found something: Title setFlowControl returning false using Java D2XX driver Detailed Description usbDevice.setFlowControl(D2xxManager.FT_FLOW_NONE, (byte) 0, (byte) 0) returns false. Root Cause The setFlowControl API does not handle the return value correctly." Problem dotyczy drivera, więc sprawa zamknięta do momentu opublikowania poprawki przez FTDI. Jednak dalej mam problem z komunikacją. Z treści zwrotnego maila jescze wynika, że funkcja set_flow_controll działa dobrze, tylko status zwraca źle... Myślałem, że set_flow_controll nie ustawia poprawnego sterowania przepływem, dlatego mam problem... //-------------------------------- W tej chwili wygląda to tak, że potrafię wysłać dane do FT232RL, dane są poprawnie odebrane z właściwą sumą CRC16. Niesety nie odbieram odpowiedzi z FT232RL mimo, że dane faktycznie są zarejestrowane przez system androida. Całość w odbiorze wygląda tak: bytesAvailable = ftDev.getQueueStatus(); funkcja zwraca poprawną ilość zbuforowanych odebranych danych, później odczytuję dane do tablicy: readed_bytes = ftDev.read(packetBytes, bytesAvailable); funkcja również zwraca tą samą wartość, czyli readed_bytes = bytesAvailable Problem w tym, ze tablica packetBytes nie zawiera odebranych danych. Zaznaczę, że dane wysyłam do urządzenia i odbieram z urządzenia w tym samym wątku... Pytanie dlaczego w buforze nie mam odebranych danych w ilości readed_bytes? Może ktoś spotkał się z podobnym problemem... Pozdrawiam! Sławek Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.