FTDI D2xx安卓java未读取
我目前正在将我从C#到Java的一些代码移植到Android系统上运行 在我的代码中,我必须从带有FTDI芯片的电路板上读取一些数据。我正在尝试使用FTDI网站上的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()时,
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;
}
}