Skocz do zawartości

Android, komunikacja FTDI, sterowanie przepływem


Recommended Posts

Napisano

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

Napisano
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.
Napisano
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
Napisano
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.
Napisano

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

  

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...