Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
6 years, 1 month ago.
mbedのUSB CDCクラスとAndroidのUSBシリアルドライバとの通信について
Androidのusb-serial-for-androidライブラリhttps://github.com/mik3y/usb-serial-for-androidと、 Mbed(STM32F303REボード改)のUSB CDCを組み合わせた通信がうまくいきません。 当初はAndroid側のポートオープン時のパーミッション取得ができておらず、オープンに失敗していたのですが、 これをクリアしたもののAndroid側でwriteするとwriteが失敗します。 (numBytesWrite に-1が返る)
下記、汚い初心者テストコードで申し訳ないのですが、test_send()中、writeに失敗する原因は何が考えられますか? (write中、bulkTransferが失敗します。タイムアウトしているようです。)
Android側コード:
wrong code
public class DeviceWaiting extends AppCompatActivity { private final String TAG = MainActivity.class.getSimpleName(); private UsbManager mUsbManager; private TextView mProgressBarTitle; private ProgressBar mProgressBar; private List<UsbSerialDriver> drivers; private static String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; PendingIntent mPermissionIntent; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_devicewaiting); mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); mProgressBar = (ProgressBar) findViewById(R.id.progressBar); mProgressBarTitle = (TextView) findViewById(R.id.progressBarTitle); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent( ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(UsbReciever, filter); waitDevice(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } private void waitDevice() { showProgressBar(); new AsyncTask<Void, Void, Integer>() { @Override protected Integer doInBackground(Void... params) { while(true) { SystemClock.sleep(1000); drivers = UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager); if (!drivers.isEmpty()) { return 0; } } } @Override protected void onPostExecute(Integer dummy) { mProgressBarTitle.setText( String.format("USBが接続されました")); hideProgressBar(); getPermission(); } }.execute((Void) null); } private void showProgressBar() { mProgressBar.setVisibility(View.VISIBLE); mProgressBarTitle.setText("USBの接続を待っています..."); } private void hideProgressBar() { mProgressBar.setVisibility(View.INVISIBLE); } private void showMainActivity() { // MainActivity.show(this, port); MainActivity.show(this); } private void getPermission() { List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager); UsbSerialDriver driver = availableDrivers.get(0); mUsbManager.requestPermission(driver.getDevice(), mPermissionIntent); } private final BroadcastReceiver UsbReciever = 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){ //showMainActivity(); test_send(); } } else { Log.d(TAG, "permission denied for device " + device); } } } } }; private void test_send() { UsbSerialDriver driver = drivers.get(0); UsbDeviceConnection connection = mUsbManager.openDevice(driver.getDevice()); if (connection == null) { return; } UsbSerialPort port = driver.getPorts().get(0); try { port.open(connection); port.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); //ここまではエラー無し port.setDTR(true); //これはmbed側に伝わっており、mbed側のusb_serial.connected()はtrueになります String buffer = "test\r\n"; int numBytesWrite = port.write(buffer.getBytes(), 1000); //numBytesWriteは-1が返ります } catch (IOException e) { } finally { } } }
試したこと:
- Android上で動くターミナルソフト(Serial USB Terminal)でデータ送信、Mbed側で受信OK。
- FT232が載ったUSBシリアルアダプタでは、このソフトでwrite成功。
- Windows10(TeraTerm)→MbedはOK。
- macOS10.13.5(screen)→MbedはOK。
→これらより、何が悪いのかサッパリわかりません・・・
遅くなりましたが、自己解決です。 ライブラリ内でエンドポイントに書き込むときに、対象のエンドポイントが間違えていました。 暫定的にライブラリ直したらうまく通信できました。
posted by Jun Yamaguchi 02 Mar 2019