FTDI D2xx安卓java未读取

FTDI D2xx安卓java未读取,java,android,ftdi,Java,Android,Ftdi,我目前正在将我从C#到Java的一些代码移植到Android系统上运行 在我的代码中,我必须从带有FTDI芯片的电路板上读取一些数据。我正在尝试使用FTDI网站上的java驱动程序 我可以连接到设备并正确地向其发送命令(指示灯应闪烁)。电路板似乎正确地向我发送数据 bytesavable=ftDevice.getQueueStatus()返回预期的数字 int bytesRead=ftDevice.read(rxData,bytesRead可用)返回相同的数字 但是,如上所述调用read()时,

我目前正在将我从C#到Java的一些代码移植到Android系统上运行

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

我可以连接到设备并正确地向其发送命令(指示灯应闪烁)。电路板似乎正确地向我发送数据

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

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

但是,如上所述调用
read()
时,我在我的日志中看到以下内容: 无法从源读取数据!! 从标签: readBulkInData::

我看不出这可能是什么。我试着在代码中修改设备的设置,但没有用。

我解决了这个问题


将整个读取指令序列(getQueueStatus()
read()
)放在另一个
线程中。具体地说,我使用了一个
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;  
            }
        }
    }
有趣的是,在下一个task.execute()调用中更新字符串和文本框。 这对我来说是可行的,可能有点棘手,但我只需要读写5个参数


这里有人知道怎么解决这个问题吗?这是在线测试和模拟器(10毫秒延迟),同样的结果。

Awesome。我被锁定在这一点上,最后我使用了第三个库,不完整,用于这一点。注意,在我的例子中,它在ARM4.2+上工作得非常完美,我在切换到x86 4.2+时遇到了问题(测试了4.2.1和4.4.2)
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;
    }
}