FTDI D2xx android java不读

我目前正在将一些我用C#编写的代码移植到Java上,以便在Android系统上运行。

在我的代码中,我必须从具有FTDI芯片的电路板读取一些数据。 我正在尝试使用FTDI网站上的java驱动程序。

我可以连接到设备并正确发送命令(LED闪烁应该如此)。 该板似乎正在向我发送数据。

bytesAvailable = ftDevice.getQueueStatus(); 返回预期的数字

int bytesRead = ftDevice.read(rxData, bytesAvailable); 返回相同的数字

但是在调用read() ,我在logcat中看到以下内容:无法从Source读取数据!! 来自标签:readBulkInData ::

我看不出这可能是什么。 我尝试在我的代码中摆弄设备的设置,但无济于事。

我解决了这个问题

将整个读取指令序列( getQueueStatus()read() )放在另一个Thread 。 具体来说,我使用了AsyncTask ,并将读取指令放在其doInBackground()方法中。

我已经修改了FTDI示例的部分用于写入并等待直到收到答案。 这适用于Parker Compax3伺服驱动器的简单HMI应用程序。 每100ms触发一次该序列。

  // 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; } } } 

这是asynctask

 class ReadAsyncTask extends AsyncTask{ @Override protected Void doInBackground(Void... params) { int j = 0; ftDev.read(rbuf,mReadSize); for(j=0; j 

在/ tricky之后更新电话但它对我有用

 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个参数。

这里的任何人都知道如何解决这个问题? 这是在线测试和模拟器(10ms延迟),相同的结果。