FTDI D2xx android java不读

时间:2014-04-10 10:35:38

标签: java android ftdi

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

我解决了这个问题。

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

答案 1 :(得分:0)

我已经修改了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<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); 
      }  
 } 

在/ 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),结果相同。