FTDI D2xx андроид java не читает

77
9

В настоящее время я переношу некоторый код, который я создал с С# на Java, чтобы работать в системе Android.


В моем коде мне нужно прочитать некоторые данные с доски с чипом FTDI. Я пытаюсь использовать драйверы java с веб-сайта FTDI.


Я могу подключиться к устройству и правильно отправлять команды (светодиоды мигают, как должны). Плата, кажется, правильно отправляет мне данные.


bytesAvailable = ftDevice.getQueueStatus(); возвращает ожидаемое число


int bytesRead = ftDevice.read(rxData, bytesAvailable); возвращает тот же номер


Однако при вызове read(), как указано выше, я вижу следующее в моем логарифме:
Не удается прочитать данные из источника!
от тега:
readBulkInData::


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

спросил(а) 2014-04-10T13:35:00+04:00 6 лет, 2 месяца назад
1
Решение
66

я изменил часть примера FTDI для записи и wait, пока не получит ответ. это работает для меня в простом приложении HMI для сервоприводов Parker Compax3. Эта последовательность запускается каждые 100 мс.


        // part of FTDI example
synchronized (ftDev) {
if(ftDev.isOpen() == false) {
return;
}
ftDev.setLatencyTimer((byte)16);
String writeString = tvWrite.getText().toString()+"\r";
byte[] writeByte = writeString.getBytes();
// write
ftDev.write(writeByte, writeString.length());

// new - wait until the buffer have data - no fixed length of incoming data - 4 - 8 bytes
readRequest = true;
startTimeRead = SystemClock.uptimeMillis();
while (true){
timeOutInMilliseconds = SystemClock.uptimeMillis() - startTimeRead;

if (timeOutInMilliseconds > timeOutTime) // checking after 70ms
{
readSize = ftDev.getQueueStatus();
if(readSize>0) {
mReadSize = readSize;
if(mReadSize > READBUF_SIZE) {
mReadSize = READBUF_SIZE;
}

readCompleted = false;

// call asynctask
ReadAsyncTask task = new ReadAsyncTask();
task.execute();

// wait until asynctask has completed
while (readCompleted = false){ // endless loop until asynctask have read
if (readCompleted = true){ // <- i know this is not necessary :-)
break;
}
}

// if read completed, write values to string/textview
if (readCompleted = true){
textView13.setText("Ok" + " " + mReadSize );
tvRead.setText(readString); //now it updates the textboxes, strings
}
}

//do anything if there are no data after 70ms
else{
readString="**";
textView13.setText("Timeout, no data");
}
// go out, wait 30ms and do it again
break;
}
}
}


здесь находится асинтаза


class ReadAsyncTask extends AsyncTask<Void, Void, Void>{  
@Override
protected Void doInBackground(Void... params) {

int j = 0;
ftDev.read(rbuf,mReadSize);
for(j=0; j<mReadSize; j++) {
rchar[j] = (char)rbuf[j];
}

// clear buffer
ftDev.purge((byte) 1);

// copy to string
readString =String.copyValueOf(rchar,0,mReadSize);
readCompleted = true;
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}

Обновить вызов после/сложный, но он работает для меня


public void requestCompax() {
sendseq += 1;
if (sendseq > 6){
sendseq = 1;
}

switch (sendseq){
case 1: //request planejado
tvWrite.setText("O1903.1"); // *send "planejado"
senddata(); // call write and read serial
tvIntrodutor.setText(readString); // *normally received the answer must be here
break;

case 2: //request produzido
tvWrite.setText("O1903.2"); // send produzido
senddata(); // call write and read serial
tvPlanejado.setText(readString); // *but received answer "planejado" - it comes here, next call later ?!?!
break;

case 3: //request value caixas
tvWrite.setText("O1903.3"); // * send caixas
senddata();
tvProduzido.setText(readString); // same with produzido
break;

case 4: //request pulas
tvWrite.setText("O1903.4");
senddata();
tvCaixas.setText(readString); // same with "caixas"
break;

case 5: //request caixas/hora
tvWrite.setText("O1903.5");
senddata();
tvPulas.setText(readString); // same with pulas
break;

case 6: //request adiantar/atrasar
tvWrite.setText("O1902.2"); //adiantar/atrasar
senddata();
tvCaixasHora.setText(readString); //same with caixas/hora
break;

default:

break;
}
}


смешные строки обновления и текстовые поля при следующем вызове task.execute().
это работает для меня, может быть, немного сложно, но мне нужно читать и писать только 5 параметров.


кто-нибудь здесь знает, как это решить? это было проверено онлайн и с симулятором (задержка 10 мс), те же результаты.

ответил(а) 2014-12-12T07:35:00+03:00 5 лет, 6 месяцев назад
87

Я решил это.

Поместив всю последовательность инструкций для чтения (getQueueStatus() и read()) в другой Thread. В частности, я использовал AsyncTask и поместил инструкции чтения в свой метод doInBackground().

ответил(а) 2014-04-11T16:02:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема