評価ボードからデータを読み取ろうとしています。Stellaris EKK-LM4F232 評価キットです。5つのボタンがあります。ボード上のボタンを押して、Android デバイスにデータを送信します。たとえば、1 回押すと、ボードは 1 に送信され、2 回目は 2 に送信されます。最初にボタンを押すと、Android デバイスから最初の値 (つまり 1) を受け取ります。しかし、ボタンをもう一度押すと、2、3、4、... などの他の値を受け取ることができません。ここに読むための私のコードがあります。スタート時は連続読み込み。手伝って頂けますか?
public void startDataRecieve() {
new Thread(new Runnable() {
@Override
public void run() {
UsbEndpoint endpoint = null;
for (int i = 0; i < intf.getEndpointCount(); i++) {
if (intf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN) {
endpoint = intf.getEndpoint(i);
break;
}
}
UsbRequest request = new UsbRequest(); // create an URB
boolean initilzed = request.initialize(connection, endpoint);
if (!initilzed) {
Log.e("USB CONNECTION FAILED", "Request initialization failed for reading");
return;
}
while (true) {
int bufferMaxLength = endpoint.getMaxPacketSize();
ByteBuffer buffer = ByteBuffer.allocate(bufferMaxLength);
if (request.queue(buffer, bufferMaxLength) == true) {
if (connection.requestWait() == request) {
String result = new String(buffer.array());
Log.i("GELEN DATA : ", result);
listener.readData(result);
}
}
}
}
}).start();
}
よく理解できない場合は、 データを読み取ったときに Android の bulkTransfer return -1 によって同じ質問がここで尋ねられますが、実際にはバッファーにデータがいくつかあります。
@Mike Ortiz との話し合いの後、すべてのコードをここに入れました。ボタンをクリックすると、Androidデバイスを送信して「START」コマンドをデバイスに送信し、読み取りを開始します。Androidデバイスに最初の値を送信すると、それを取得できますが、最初の値の後、USBデバイスから値を取得できません。USBデバイスが値を送信していると確信しています。
public class MainActivity extends Activity implements Runnable {
private static final String TAG = "MAIN ACTIVITY TEST ";
private Button buttonConnect;
private Button butonSend;
private Button buttonDisconnect;
private TextView textViewResult;
private UsbDevice device;
private Thread readThread;
private UsbManager usbManager;
private UsbDeviceConnection connection;
private UsbInterface usbInterface;
private UsbEndpoint usbEndpointIn;
private UsbEndpoint usbEndpointOut;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
if (device.getVendorId() == 7358 && device.getProductId() == 3) {
this.device = device;
usbManager.requestPermission(device, mPermissionIntent);
break;
}
}
butonSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
usbInterface = device.getInterface(0);
connection = usbManager.openDevice(device);
connection.claimInterface(usbInterface, false);
for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
UsbEndpoint end = usbInterface.getEndpoint(i);
if (end.getDirection() == UsbConstants.USB_DIR_IN) {
usbEndpointIn = end;
} else {
usbEndpointOut = end;
}
}
//SEND START COMMAND TO THE USB DEVICE;
int result = connection.bulkTransfer(usbEndpointOut, "START".getBytes(), "START".getBytes().length, 1000);
Log.e("SEND RESULT", result + "");
//START READING in run method
readThread = new Thread(MainActivity.this);
readThread.start();
}
});
buttonDisconnect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mRunning = false;
//readThread.stop();
connection.releaseInterface(usbInterface);
connection.close();
Log.e(TAG, "Connection CLosed.");
}
});
}
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {
Toast.makeText(MainActivity.this, "Cihaza izin verildi", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(MainActivity.this, "Cihaza izin verilmedi.", Toast.LENGTH_LONG).show();
Log.d(TAG, "permission denied for device " + device);
}
}
}
}
};
private boolean mRunning;
private void initView() {
butonSend = (Button) findViewById(R.id.buttonSend);
buttonConnect = (Button) findViewById(R.id.buttonConnect);
textViewResult = (TextView) findViewById(R.id.textViewResult);
buttonDisconnect = (Button) findViewById(R.id.buttonDisconnect);
}
@Override
public void run() {
mRunning = true;
//READ VALUE UNTIL DISCONNECT
while (mRunning) {
byte[] bytes = new byte[usbEndpointIn.getMaxPacketSize()];
int result = connection.bulkTransfer(usbEndpointIn, bytes, bytes.length, 1000);
if(result > 0)
Log.e("RESULT : " + result, " VALUE : " + new String(bytes));
}
Log.d("Thread", "STOPPPED");
}
}