Проблема в следующем, разные команды дают ответ разной длины, в примере который я взял там эта длина жестко прописана в 256 значений, но я принимаю команды разной длины от 8 и до 123.
Как правильно сделать чтобы принимать значение с любой длиной ?
К примеру те команды что в коде нижу они возвращают ответ длиной 96 значений, если в переменой READBUF_SIZE сменить на 96 то тогда все супер, но как быть тогда с другими командами ?
Код который я брал для примера вот -
ссылкаUPD:
Более подробно я описал здесь
Вот мой код:
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();
}
}
};
}