问题描述
我正在学习如何使用 UsbManager 文档和 UsbSerial 库通过 USB 将 arduino 连接到 android 进行通信。活动打开,当我点击一个按钮与 Arduino 建立连接时,会弹出一个权限提示“Arduino 想要与 null 连接”,如果允许,应用程序崩溃。我尝试了许多在线可用的代码,但问题仍然存在。这是活动java代码。我删除了一些与此功能无关的代码。请询问任何其他必要的信息。谢谢...
SerialView.java
public class SerialView extends AppCompatActivity {
PendingIntent mPermissionIntent;
UsbDevice usbdevice;
UsbManager usbManager;
private static final String ACTION_USB_PERMISSION = "com.xyz.arduino.USB_PERMISSION";
UsbSerialDevice serialPort;
private static final int targetvendorID = 2341; //Arduino Uno
private static final int targetProductID = 43;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_serial_view);
textView=(TextView) findViewById(R.id.streamdisplay);
}
public void onClickStart(View view) {
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getbroadcast(this,new Intent(
ACTION_USB_PERMISSION),0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver,filter);
HashMap<String,UsbDevice> deviceList = usbManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
usbManager.requestPermission(device,mPermissionIntent);
if (device.getvendorId() == targetvendorID) {
if (device.getProductId() == targetProductID) {
usbdevice = 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) {
UsbDeviceConnection connection = usbManager.openDevice(usbdevice);
serialPort = UsbSerialDevice.createUsbSerialDevice(usbdevice,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(View view){
serialPort.close();
Toast.makeText(SerialView.this,"Arduino disconnected",Toast.LENGTH_LONG)
.show();
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)