Answer the question
In order to leave comments, you need to log in
D2XX library for Android, how to correctly read responses of different lengths?
The problem is the following, different commands give a response of different lengths, in the example that I took there, this length is hardcoded in 256 values, but I accept commands of different lengths from 8 to 123.
How to do it correctly to accept a value with any length?
For example, those commands that are in the code below, they return a response with a length of 96 values, if you change READBUF_SIZE to 96 in the variable, then everything is super, but then what about other commands?
The code that I took as an example is here - link
UPD : I described in more detail here
Here is my code:
public class MainActivity extends AppCompatActivity {
private static D2xxManager ftD2xx = null;
private FT_Device ftDev;
static final int READBUF_SIZE = 256;
byte[] rbuf = new byte[READBUF_SIZE];
char[] rchar = new char[READBUF_SIZE];
int mReadSize=0;
boolean mThreadIsStopped = true;
Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
ftD2xx = D2xxManager.getInstance(this);
} catch (D2xxManager.D2xxException ex) {
Log.e("MyLog",ex.toString());
}
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(mUsbReceiver, filter);
}
@Override
protected void onStop(){
super.onStop();
}
//Fires after the OnStop() state
@Override
protected void onDestroy() {
super.onDestroy();
try {
unregisterReceiver(mUsbReceiver);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void OnClickOpenDevice(View view){
Log.i("MyLog", "Button open device");
openDevice();
}
public void OnClickOnOne (View view){
if(ftDev == null) {
return;
}
synchronized (ftDev) {
if(ftDev.isOpen() == false) {
Log.e("MyLog", "onClickWrite : Device is not open");
return;
}
ftDev.setLatencyTimer((byte) 16);
byte[] send = new byte[]{1, 5, 0, 5, 0, 1, 28, 11};
ftDev.write(send, send.length);
}
}
public void OnClickOffOne(View view){
if(ftDev == null) {
return;
}
synchronized (ftDev) {
if(ftDev.isOpen() == false) {
Log.e("MyLog", "onClickWrite : Device is not open");
return;
}
ftDev.setLatencyTimer((byte) 16);
byte[] send = new byte[]{1, 5, 0, 1, 0, 1, 93, -54};
ftDev.write(send, send.length);
}
}
private void openDevice() {
if(ftDev != null) {
if(ftDev.isOpen()) {
//updateView(true);
SetConfig(19200, D2xxManager.FT_DATA_BITS_8, D2xxManager.FT_STOP_BITS_1, D2xxManager.FT_PARITY_NONE, (byte)0);
ftDev.purge((byte) (D2xxManager.FT_PURGE_TX | D2xxManager.FT_PURGE_RX));
ftDev.restartInTask();
new Thread(mLoop).start();
}
return;
}
int devCount = 0;
devCount = ftD2xx.createDeviceInfoList(this);
Log.d("MyLog", "Device number : " + Integer.toString(devCount));
D2xxManager.FtDeviceInfoListNode[] deviceList = new D2xxManager.FtDeviceInfoListNode[devCount];
ftD2xx.getDeviceInfoList(devCount, deviceList);
if(devCount <= 0) {
return;
}
if(ftDev == null) {
ftDev = ftD2xx.openByIndex(this, 0);
} else {
synchronized (ftDev) {
ftDev = ftD2xx.openByIndex(this, 0);
}
}
if(ftDev.isOpen()) {
//updateView(true);
SetConfig(19200, (byte) 8, (byte) 1, (byte) 0, (byte) 0);
ftDev.purge((byte) (D2xxManager.FT_PURGE_TX | D2xxManager.FT_PURGE_RX));
ftDev.restartInTask();
new Thread(mLoop).start();
}
}
private void closeDevice() {
//updateView(false);
if(ftDev != null) {
ftDev.close();
}
}
private Runnable mLoop = new Runnable() {
@Override
public void run() {
int i;
int readSize;
mThreadIsStopped = false;
while(true) {
if(mThreadIsStopped) {
break;
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
}
synchronized (ftDev) {
readSize = ftDev.getQueueStatus();
if(readSize>0) {
mReadSize = readSize;
if(mReadSize > READBUF_SIZE) {
mReadSize = READBUF_SIZE;
}
ftDev.read(rbuf, mReadSize);
// cannot use System.arraycopy
for(i=0; i<mReadSize; i++) {
rchar[i] = (char)rbuf[i];
}
mHandler.post(new Runnable() {
@Override
public void run() {
Log.i("MyLog", "Handler post: " + Arrays.toString(rbuf));
Log.e("MyLog", "Длина: " + rbuf.length);
}
});
} // end of if(readSize>0)
} // end of synchronized
}
}
};
public void SetConfig(int baud, byte dataBits, byte stopBits, byte parity, byte flowControl) {
if (ftDev.isOpen() == false) {
Log.e("MyLog", "SetConfig: device not open");
return;
}
// configure our port
// reset to UART mode for 232 devices
ftDev.setBitMode((byte) 0, D2xxManager.FT_BITMODE_RESET);
ftDev.setBaudRate(baud);
switch (dataBits) {
case 7:
dataBits = D2xxManager.FT_DATA_BITS_7;
break;
case 8:
dataBits = D2xxManager.FT_DATA_BITS_8;
break;
default:
dataBits = D2xxManager.FT_DATA_BITS_8;
break;
}
switch (stopBits) {
case 1:
stopBits = D2xxManager.FT_STOP_BITS_1;
break;
case 2:
stopBits = D2xxManager.FT_STOP_BITS_2;
break;
default:
stopBits = D2xxManager.FT_STOP_BITS_1;
break;
}
switch (parity) {
case 0:
parity = D2xxManager.FT_PARITY_NONE;
break;
case 1:
parity = D2xxManager.FT_PARITY_ODD;
break;
case 2:
parity = D2xxManager.FT_PARITY_EVEN;
break;
case 3:
parity = D2xxManager.FT_PARITY_MARK;
break;
case 4:
parity = D2xxManager.FT_PARITY_SPACE;
break;
default:
parity = D2xxManager.FT_PARITY_NONE;
break;
}
ftDev.setDataCharacteristics(dataBits, stopBits, parity);
short flowCtrlSetting;
switch (flowControl) {
case 0:
flowCtrlSetting = D2xxManager.FT_FLOW_NONE;
break;
case 1:
flowCtrlSetting = D2xxManager.FT_FLOW_RTS_CTS;
break;
case 2:
flowCtrlSetting = D2xxManager.FT_FLOW_DTR_DSR;
break;
case 3:
flowCtrlSetting = D2xxManager.FT_FLOW_XON_XOFF;
break;
default:
flowCtrlSetting = D2xxManager.FT_FLOW_NONE;
break;
}
// TODO : flow ctrl: XOFF/XOM
// TODO : flow ctrl: XOFF/XOM
ftDev.setFlowControl(flowCtrlSetting, (byte) 0x0b, (byte) 0x0d);
}
// done when ACTION_USB_DEVICE_ATTACHED
@Override
protected void onNewIntent(Intent intent) {
openDevice();
};
BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
// never come here(when attached, go to onNewIntent)
openDevice();
} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
closeDevice();
}
}
};
}
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question