mirror of
https://github.com/mik3y/usb-serial-for-android
synced 2025-06-08 00:16:13 +00:00
example app with event-based or direct read
This commit is contained in:
parent
2354f93354
commit
ca78840144
@ -6,7 +6,7 @@ buildscript {
|
|||||||
google()
|
google()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.6.1'
|
classpath 'com.android.tools.build:gradle:3.6.2'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ package com.hoho.android.usbserial.examples;
|
|||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.hardware.usb.UsbDevice;
|
import android.hardware.usb.UsbDevice;
|
||||||
import android.hardware.usb.UsbManager;
|
import android.hardware.usb.UsbManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@ -41,6 +40,7 @@ public class DevicesFragment extends ListFragment {
|
|||||||
private ArrayList<ListItem> listItems = new ArrayList<>();
|
private ArrayList<ListItem> listItems = new ArrayList<>();
|
||||||
private ArrayAdapter<ListItem> listAdapter;
|
private ArrayAdapter<ListItem> listAdapter;
|
||||||
private int baudRate = 19200;
|
private int baudRate = 19200;
|
||||||
|
private boolean withIoManager = true;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
@ -95,15 +95,24 @@ public class DevicesFragment extends ListFragment {
|
|||||||
refresh();
|
refresh();
|
||||||
return true;
|
return true;
|
||||||
} else if (id ==R.id.baud_rate) {
|
} else if (id ==R.id.baud_rate) {
|
||||||
final String[] baudRates = getResources().getStringArray(R.array.baud_rates);
|
final String[] values = getResources().getStringArray(R.array.baud_rates);
|
||||||
int pos = java.util.Arrays.asList(baudRates).indexOf(String.valueOf(baudRate));
|
int pos = java.util.Arrays.asList(values).indexOf(String.valueOf(baudRate));
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
builder.setTitle("Baud rate");
|
builder.setTitle("Baud rate");
|
||||||
builder.setSingleChoiceItems(baudRates, pos, new DialogInterface.OnClickListener() {
|
builder.setSingleChoiceItems(values, pos, (dialog, which) -> {
|
||||||
public void onClick(DialogInterface dialog, int item) {
|
baudRate = Integer.parseInt(values[which]);
|
||||||
baudRate = Integer.valueOf(baudRates[item]);
|
dialog.dismiss();
|
||||||
|
});
|
||||||
|
builder.create().show();
|
||||||
|
return true;
|
||||||
|
} else if (id ==R.id.read_mode) {
|
||||||
|
final String[] values = getResources().getStringArray(R.array.read_modes);
|
||||||
|
int pos = withIoManager ? 0 : 1; // read_modes[0]=event/io-manager, read_modes[1]=direct
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle("Read mode");
|
||||||
|
builder.setSingleChoiceItems(values, pos, (dialog, which) -> {
|
||||||
|
withIoManager = (which == 0);
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
}
|
|
||||||
});
|
});
|
||||||
builder.create().show();
|
builder.create().show();
|
||||||
return true;
|
return true;
|
||||||
@ -142,6 +151,7 @@ public class DevicesFragment extends ListFragment {
|
|||||||
args.putInt("device", item.device.getDeviceId());
|
args.putInt("device", item.device.getDeviceId());
|
||||||
args.putInt("port", item.port);
|
args.putInt("port", item.port);
|
||||||
args.putInt("baud", baudRate);
|
args.putInt("baud", baudRate);
|
||||||
|
args.putBoolean("withIoManager", withIoManager);
|
||||||
Fragment fragment = new TerminalFragment();
|
Fragment fragment = new TerminalFragment();
|
||||||
fragment.setArguments(args);
|
fragment.setArguments(args);
|
||||||
getFragmentManager().beginTransaction().replace(R.id.fragment, fragment, "terminal").addToBackStack(null).commit();
|
getFragmentManager().beginTransaction().replace(R.id.fragment, fragment, "terminal").addToBackStack(null).commit();
|
||||||
|
@ -36,6 +36,7 @@ import com.hoho.android.usbserial.util.HexDump;
|
|||||||
import com.hoho.android.usbserial.util.SerialInputOutputManager;
|
import com.hoho.android.usbserial.util.SerialInputOutputManager;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
public class TerminalFragment extends Fragment implements SerialInputOutputManager.Listener {
|
public class TerminalFragment extends Fragment implements SerialInputOutputManager.Listener {
|
||||||
@ -44,8 +45,10 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag
|
|||||||
|
|
||||||
private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
|
private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
|
||||||
private static final int WRITE_WAIT_MILLIS = 2000;
|
private static final int WRITE_WAIT_MILLIS = 2000;
|
||||||
|
private static final int READ_WAIT_MILLIS = 2000;
|
||||||
|
|
||||||
private int deviceId, portNum, baudRate;
|
private int deviceId, portNum, baudRate;
|
||||||
|
private boolean withIoManager;
|
||||||
|
|
||||||
private BroadcastReceiver broadcastReceiver;
|
private BroadcastReceiver broadcastReceiver;
|
||||||
private Handler mainLooper;
|
private Handler mainLooper;
|
||||||
@ -82,6 +85,7 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag
|
|||||||
deviceId = getArguments().getInt("device");
|
deviceId = getArguments().getInt("device");
|
||||||
portNum = getArguments().getInt("port");
|
portNum = getArguments().getInt("port");
|
||||||
baudRate = getArguments().getInt("baud");
|
baudRate = getArguments().getInt("baud");
|
||||||
|
withIoManager = getArguments().getBoolean("withIoManager");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -115,7 +119,13 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag
|
|||||||
TextView sendText = view.findViewById(R.id.send_text);
|
TextView sendText = view.findViewById(R.id.send_text);
|
||||||
View sendBtn = view.findViewById(R.id.send_btn);
|
View sendBtn = view.findViewById(R.id.send_btn);
|
||||||
sendBtn.setOnClickListener(v -> send(sendText.getText().toString()));
|
sendBtn.setOnClickListener(v -> send(sendText.getText().toString()));
|
||||||
|
View receiveBtn = view.findViewById(R.id.receive_btn);
|
||||||
controlLines = new ControlLines(view);
|
controlLines = new ControlLines(view);
|
||||||
|
if(withIoManager) {
|
||||||
|
receiveBtn.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
receiveBtn.setOnClickListener(v -> read());
|
||||||
|
}
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,8 +207,10 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag
|
|||||||
try {
|
try {
|
||||||
usbSerialPort.open(usbConnection);
|
usbSerialPort.open(usbConnection);
|
||||||
usbSerialPort.setParameters(baudRate, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
|
usbSerialPort.setParameters(baudRate, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
|
||||||
|
if(withIoManager) {
|
||||||
usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
|
usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
|
||||||
Executors.newSingleThreadExecutor().submit(usbIoManager);
|
Executors.newSingleThreadExecutor().submit(usbIoManager);
|
||||||
|
}
|
||||||
status("connected");
|
status("connected");
|
||||||
connected = true;
|
connected = true;
|
||||||
controlLines.start();
|
controlLines.start();
|
||||||
@ -228,7 +240,7 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag
|
|||||||
try {
|
try {
|
||||||
byte[] data = (str + '\n').getBytes();
|
byte[] data = (str + '\n').getBytes();
|
||||||
SpannableStringBuilder spn = new SpannableStringBuilder();
|
SpannableStringBuilder spn = new SpannableStringBuilder();
|
||||||
spn.append("send " + data.length + " bytes:\n");
|
spn.append("send " + data.length + " bytes\n");
|
||||||
spn.append(HexDump.dumpHexString(data)+"\n");
|
spn.append(HexDump.dumpHexString(data)+"\n");
|
||||||
spn.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorSendText)), 0, spn.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
spn.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorSendText)), 0, spn.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
receiveText.append(spn);
|
receiveText.append(spn);
|
||||||
@ -238,10 +250,27 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void read() {
|
||||||
|
if(!connected) {
|
||||||
|
Toast.makeText(getActivity(), "not connected", Toast.LENGTH_SHORT).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
byte[] buffer = new byte[8192];
|
||||||
|
int len = usbSerialPort.read(buffer, READ_WAIT_MILLIS);
|
||||||
|
receive(Arrays.copyOf(buffer, len));
|
||||||
|
} catch (IOException e) {
|
||||||
|
// when using read with timeout, USB bulkTransfer returns -1 on timeout _and_ errors
|
||||||
|
// like connection loss, so there is typically no exception thrown here on error
|
||||||
|
status("connection lost: " + e.getMessage());
|
||||||
|
disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void receive(byte[] data) {
|
private void receive(byte[] data) {
|
||||||
String str = new String(data);
|
|
||||||
SpannableStringBuilder spn = new SpannableStringBuilder();
|
SpannableStringBuilder spn = new SpannableStringBuilder();
|
||||||
spn.append("receive " + data.length + " bytes:\n");
|
spn.append("receive " + data.length + " bytes\n");
|
||||||
|
if(data.length > 0)
|
||||||
spn.append(HexDump.dumpHexString(data)+"\n");
|
spn.append(HexDump.dumpHexString(data)+"\n");
|
||||||
receiveText.append(spn);
|
receiveText.append(spn);
|
||||||
}
|
}
|
||||||
|
@ -93,6 +93,12 @@
|
|||||||
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
||||||
android:typeface="monospace" />
|
android:typeface="monospace" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/receive_btn"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Read" />
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:background="?android:attr/listDivider"
|
android:background="?android:attr/listDivider"
|
||||||
|
@ -6,4 +6,7 @@
|
|||||||
<item
|
<item
|
||||||
android:id="@+id/baud_rate"
|
android:id="@+id/baud_rate"
|
||||||
android:title="Baud rate" />
|
android:title="Baud rate" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/read_mode"
|
||||||
|
android:title="Read mode" />
|
||||||
</menu>
|
</menu>
|
||||||
|
@ -7,4 +7,8 @@
|
|||||||
<item>57600</item>
|
<item>57600</item>
|
||||||
<item>115200</item>
|
<item>115200</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="read_modes">
|
||||||
|
<item>event: SerialInputOutputManager.onNewData()</item>
|
||||||
|
<item>direct: UsbSerialPort.read()</item>
|
||||||
|
</string-array>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user