问题描述
我目前正在学习通过电话将 USB 连接到 Arduino 以处理一个项目。正在使用 Developer documentation 并且遇到 UsbManager 错误后,我尝试了一些其他教程和 stackoverflow 帮助,但无济于事。我正在使用 this 库进行 android 和 arduino 之间的串行通信。无法发布 logcat,因为它会在我打开活动时立即清除,在闪烁一些日志后。我注意到一条蓝线,多次尝试后发现它指的是 UsbManager 声明行。请询问任何额外的信息...
Java 文件:
public class SerialView extends AppCompatActivity {
UsbDeviceConnection connection;
UsbManager usbManager = (UsbManager) this.getSystemService(android.content.Context.USB_SERVICE);
UsbDevice devices ; broadcastReceiver mUsbDeviceReceiver;
HashMap<String,UsbDevice> usbDevices = usbManager.getDeviceList();
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
UsbSerialDevice serialPort;
private static final int targetvendorID = 2341; //Arduino Uno
private static final int targetProductID = 43;
PendingIntent mPermissionIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_serial_view);
TextView textView=(TextView) findViewById(R.id.streamdisplay);
mPermissionIntent = PendingIntent.getbroadcast(this,new Intent(
ACTION_USB_PERMISSION),0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver,filter);
registerReceiver(mUsbDeviceReceiver,new IntentFilter(
UsbManager.ACTION_USB_DEVICE_ATTACHED));
registerReceiver(mUsbDeviceReceiver,new IntentFilter(
UsbManager.ACTION_USB_DEVICE_DETACHED));
}
@Override
protected void onDestroy() {
releaseUsb();
unregisterReceiver(mUsbDeviceReceiver);
unregisterReceiver(mUsbDeviceReceiver);
super.onDestroy();
}
private void releaseUsb() {
Toast.makeText(SerialView.this,"releaseUsb()",Toast.LENGTH_LONG)
.show();
if (connection != null) {
connection.close();
connection = null;
}
devices = null;
}
public void onClickStart **onClick** (View view) {
if (devices != null) {
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
Iterator<UsbDevice> deviceIterator = usbDevices.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
if (device.getvendorId() == targetvendorID) {
if (device.getProductId() == targetProductID) {
devices = device;
}
}
}
}
}
private final broadcastReceiver mUsbReceiver = new broadcastReceiver() {
//broadcast Receiver to automatically start and stop the Serial connection.
@Override
public void onReceive(Context context,Intent intent) {
if (intent.getAction().equals(ACTION_USB_PERMISSION)) {
boolean granted =
intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED);
if (granted) {
connection = usbManager.openDevice(devices);
serialPort = UsbSerialDevice.createUsbSerialDevice(devices,connection);
if (serialPort != null) {
if (serialPort.open()) { //Set Serial Connection Parameters.
//Enable Buttons in UI
serialPort.setBaudrate(9600);
serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8);
serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1);
serialPort.setParity(UsbSerialInterface.PARITY_NONE);
serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {
//Defining a Callback which triggers whenever data is read.
@Override
public void onReceivedData(byte[] arg0) {
String data = null;
try {
data = new String(arg0,"UTF-8");
data.concat("/n");
tvAppend(textView,data);
} catch (UnsupportedEncodingException e) {
e.printstacktrace();
}
}
};
serialPort.read(mCallback);
tvAppend(textView,"Serial Connection Opened!\n");
} else {
Log.d("SERIAL","PORT NOT OPEN");
}
} else {
Log.d("SERIAL","PORT IS NULL");
}
} else {
Log.d("SERIAL","PERM NOT GRANTED");
}
} else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
onClickStart(findViewById(R.id.startconbut));
} else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {
onClickStop(findViewById(R.id.endconbut));
}
};
};
private void tvAppend(TextView tv,CharSequence text) { final TextView ftv = tv; final CharSequence ftext = text; runOnUiThread(new Runnable() { @Override public void run() { ftv.append(ftext); } }); }
public void onClickStop **onClick** (View view){
serialPort.close();
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)