Skocz do zawartości

Android, komunikacja FTDI, sterowanie przepływem


aju_cor

Recommended Posts

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

Link do komentarza
Udostępnij na innych stronach

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.
Link do komentarza
Udostępnij na innych stronach

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
Link do komentarza
Udostępnij na innych stronach

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.
Link do komentarza
Udostępnij na innych stronach

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

  

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...