回答編集履歴

3

うまく動かないことがあるようなので、その旨追記した。

2019/08/29 04:20

投稿

murakami-kurio
murakami-kurio

スコア15

test CHANGED
@@ -10,6 +10,20 @@
10
10
 
11
11
  みなさま、いろいろありがとうございました。
12
12
 
13
+ ###追記(2019.Aug.29)
14
+
15
+ 大量に(あるいは高速に)データを受け取ると、
16
+
17
+ Handlerまでデータが届かない、という症状が出ております。
18
+
19
+ readDataまで、データは来ているようなのですが...。
20
+
21
+ タイマーを追加し、マイコンの手法で読んでみたいと思います。
22
+
23
+
24
+
25
+ 追記、ここまで。
26
+
13
27
 
14
28
 
15
29
  ###追記(2019.July.25)

2

安定して動かなかった旨、修正し追記しました。

2019/08/29 04:20

投稿

murakami-kurio
murakami-kurio

スコア15

test CHANGED
@@ -12,6 +12,40 @@
12
12
 
13
13
 
14
14
 
15
+ ###追記(2019.July.25)
16
+
17
+ 受信が安定しないようなので、次のように変えました。
18
+
19
+ [オープン・リード・ライト・クローズで見るAndroid FTDI公式 ドライバ](https://ksksue.hatenadiary.org/entry/20130402/1364922862)
20
+
21
+ ```java
22
+
23
+ ftDev.read(readData, iavailable);
24
+
25
+ // String mData = new String(readData);
26
+
27
+ // cannot use System.arraycopy
28
+
29
+ for(i=0; i<iavailable; i++) {
30
+
31
+ readDataToText[i] = (char)readData[i];
32
+
33
+ }
34
+
35
+ Message msg = mHandler.obtainMessage();
36
+
37
+ // msg.obj = mData;
38
+
39
+ msg.obj = String.copyValueOf(readDataToText,0,iavailable);
40
+
41
+ mHandler.sendMessage(msg);
42
+
43
+ ```
44
+
45
+ 追記ここまで。
46
+
47
+
48
+
15
49
  MainActivity.java
16
50
 
17
51
  ```java
@@ -236,224 +270,182 @@
236
270
 
237
271
  /* 20190703
238
272
 
239
- @Override
273
+ */
240
-
274
+
241
- public boolean onCreateOptionsMenu(Menu menu) {
275
+ public void SendMessage(String msg) {
242
-
243
- // Inflate the menu; this adds items to the action bar if it is present.
276
+
244
-
277
+
278
+
245
- getMenuInflater().inflate(R.menu.menu_main, menu);
279
+ if(ftDev == null){
246
-
280
+
247
- return true;
281
+ return;
282
+
283
+ }
284
+
285
+
286
+
287
+ synchronized (ftDev) {
288
+
289
+ if (ftDev.isOpen() == false) {
290
+
291
+ Log.e("j2xx", "SendMessage: device not open");
292
+
293
+ return;
294
+
295
+ }
296
+
297
+
298
+
299
+ ftDev.setLatencyTimer((byte) 16);
300
+
301
+
302
+
303
+ if (msg != null) {
304
+
305
+ byte[] OutData = msg.getBytes();
306
+
307
+ ftDev.write(OutData, msg.length());
308
+
309
+ }
310
+
311
+ }
248
312
 
249
313
  }
250
314
 
251
-
315
+ private class ReadThread extends Thread
316
+
252
-
317
+ {
318
+
319
+ Handler mHandler;
320
+
321
+
322
+
323
+ ReadThread(Handler h){
324
+
325
+ mHandler = h;
326
+
327
+ this.setPriority(Thread.MIN_PRIORITY);
328
+
329
+ }
330
+
331
+
332
+
253
- @Override
333
+ @Override
254
-
334
+
255
- public boolean onOptionsItemSelected(MenuItem item) {
335
+ public void run()
336
+
256
-
337
+ {
338
+
257
- // Handle action bar item clicks here. The action bar will
339
+ int i;
258
-
259
- // automatically handle clicks on the Home/Up button, so long
340
+
260
-
261
- // as you specify a parent activity in AndroidManifest.xml.
341
+
262
-
342
+
263
- int id = item.getItemId();
343
+ while(true == isReading)
344
+
264
-
345
+ {
346
+
265
-
347
+ try {
266
-
348
+
267
- //noinspection SimplifiableIfStatement
349
+ Thread.sleep(50);
268
-
350
+
269
- if (id == R.id.action_settings) {
351
+ } catch (InterruptedException e) {
270
-
271
- return true;
352
+
272
-
273
- }
353
+ }
354
+
355
+
356
+
274
-
357
+ synchronized(ftDev)
358
+
275
-
359
+ {
360
+
276
-
361
+ iavailable = ftDev.getQueueStatus();
362
+
363
+ if (iavailable > 0) {
364
+
365
+
366
+
367
+ if(iavailable > readLength){
368
+
369
+ iavailable = readLength;
370
+
371
+ }
372
+
373
+
374
+
375
+ ftDev.read(readData, iavailable);
376
+
377
+ String mData = new String(readData);
378
+
277
- return super.onOptionsItemSelected(item);
379
+ Message msg = mHandler.obtainMessage();
380
+
381
+ msg.obj = mData;
382
+
383
+ mHandler.sendMessage(msg);
384
+
385
+ }
386
+
387
+ }
388
+
389
+ }
390
+
391
+ }
392
+
393
+
278
394
 
279
395
  }
280
396
 
397
+
398
+
399
+ /**
400
+
401
+ * 描画処理はHandlerでおこなう
402
+
281
- */
403
+ */
404
+
282
-
405
+ Handler mHandler = new Handler() {
406
+
407
+ @Override
408
+
283
- public void SendMessage(String msg) {
409
+ public void handleMessage(Message msg) {
284
-
285
-
286
-
410
+
287
- if(ftDev == null){
411
+ String mData = (String)msg.obj;
288
-
412
+
289
- return;
413
+ mInputValue.setText(mData);
290
-
414
+
291
- }
415
+ }
416
+
292
-
417
+ };
418
+
419
+
420
+
293
-
421
+ BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
422
+
294
-
423
+ public void onReceive(Context context, Intent intent) {
424
+
295
- synchronized (ftDev) {
425
+ String action = intent.getAction();
426
+
296
-
427
+ if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
428
+
429
+ // never come here(when attached, go to onNewIntent)
430
+
431
+ openUsb();
432
+
433
+ } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
434
+
297
- if (ftDev.isOpen() == false) {
435
+ if(ftDev != null) {
298
-
299
- Log.e("j2xx", "SendMessage: device not open");
436
+
300
-
301
- return;
437
+ ftDev.close();
438
+
439
+ isReading = false;
440
+
441
+ }
302
442
 
303
443
  }
304
444
 
305
-
306
-
307
- ftDev.setLatencyTimer((byte) 16);
308
-
309
-
310
-
311
- if (msg != null) {
312
-
313
- byte[] OutData = msg.getBytes();
314
-
315
- ftDev.write(OutData, msg.length());
316
-
317
- }
318
-
319
- }
320
-
321
- }
322
-
323
- private class ReadThread extends Thread
324
-
325
- {
326
-
327
- Handler mHandler;
328
-
329
-
330
-
331
- ReadThread(Handler h){
332
-
333
- mHandler = h;
334
-
335
- this.setPriority(Thread.MIN_PRIORITY);
336
-
337
- }
338
-
339
-
340
-
341
- @Override
342
-
343
- public void run()
344
-
345
- {
346
-
347
- int i;
348
-
349
-
350
-
351
- while(true == isReading)
352
-
353
- {
354
-
355
- try {
356
-
357
- Thread.sleep(50);
358
-
359
- } catch (InterruptedException e) {
360
-
361
- }
362
-
363
-
364
-
365
- synchronized(ftDev)
366
-
367
- {
368
-
369
- iavailable = ftDev.getQueueStatus();
370
-
371
- if (iavailable > 0) {
372
-
373
-
374
-
375
- if(iavailable > readLength){
376
-
377
- iavailable = readLength;
378
-
379
- }
380
-
381
-
382
-
383
- ftDev.read(readData, iavailable);
384
-
385
- String mData = new String(readData);
386
-
387
- Message msg = mHandler.obtainMessage();
388
-
389
- msg.obj = mData;
390
-
391
- mHandler.sendMessage(msg);
392
-
393
- }
394
-
395
- }
396
-
397
- }
398
-
399
- }
400
-
401
-
402
-
403
- }
404
-
405
-
406
-
407
- /**
408
-
409
- * 描画処理はHandlerでおこなう
410
-
411
- */
412
-
413
- Handler mHandler = new Handler() {
414
-
415
- @Override
416
-
417
- public void handleMessage(Message msg) {
418
-
419
- String mData = (String)msg.obj;
420
-
421
- mInputValue.setText(mData);
422
-
423
445
  }
424
446
 
425
447
  };
426
448
 
427
-
428
-
429
- BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
430
-
431
- public void onReceive(Context context, Intent intent) {
432
-
433
- String action = intent.getAction();
434
-
435
- if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
436
-
437
- // never come here(when attached, go to onNewIntent)
438
-
439
- openUsb();
440
-
441
- } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
442
-
443
- if(ftDev != null) {
444
-
445
- ftDev.close();
446
-
447
- isReading = false;
448
-
449
- }
450
-
451
- }
452
-
453
- }
454
-
455
- };
456
-
457
449
  }
458
450
 
459
451
 

1

足りなかった、ソースを加えた。

2019/07/25 04:29

投稿

murakami-kurio
murakami-kurio

スコア15

test CHANGED
@@ -562,8 +562,72 @@
562
562
 
563
563
 
564
564
 
565
-
565
+ AndroidManifest.xml
566
+
567
+ ```xml
568
+
569
+ <?xml version="1.0" encoding="utf-8"?>
570
+
571
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
572
+
573
+ package="xx.xx.xxxx.myusbhost">
574
+
575
+
576
+
577
+ <application
578
+
579
+ android:allowBackup="true"
580
+
581
+ android:icon="@mipmap/ic_launcher"
582
+
583
+ android:label="@string/app_name"
584
+
585
+ android:roundIcon="@mipmap/ic_launcher_round"
586
+
587
+ android:supportsRtl="true"
588
+
589
+ android:theme="@style/AppTheme">
590
+
591
+ <activity android:name=".MainActivity">
592
+
593
+ <intent-filter>
594
+
595
+ <action android:name="android.intent.action.MAIN" />
596
+
597
+ <action android:name="android.intent.action.VIEW"/>
598
+
599
+
600
+
601
+ <category android:name="android.intent.category.LAUNCHER" />
602
+
603
+ </intent-filter>
604
+
605
+ <intent-filter>
606
+
607
+ <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
608
+
609
+ </intent-filter>
610
+
611
+
612
+
613
+ <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
614
+
615
+ android:resource="@xml/device_filter" />
616
+
617
+
618
+
619
+ </activity>
620
+
621
+ </application>
622
+
623
+
624
+
625
+ </manifest>
566
626
 
567
627
  ```
568
628
 
629
+
630
+
631
+ device_filter.xml
632
+
569
- ```
633
+ は、質問と同じ。