序
开发环境:安卓版 AIDE,windows版 Android studio APP适用范围:androuid 6.0以上 调试设备:一部安卓手机,一个51单片机 最终实现功能:一个USB串口调试助手,内置各种驱动,波特率,停止位,数据位…设置,显示转换。 适看人群:小白 声明:我也是刚入坑半个月的小白,网上USB串口通信教程一写一大堆,看都看不懂,而且复制还不能运行,不是缺这个就是缺那个,所以我尽量减少导入其他包,核心代码仅10行代码完成一次Android USB串口通信,并且逐行解释。这样方便移植,包会上传GitHub。
功能展示
10行代码能有什么效果?安卓手机向51单片机发送送“你好”,51单片机回显“你好”给手机,通过气泡显示出内容。这个在软件首次打开执行一次,所以插上单片机打开软件可以提示气泡“你好”。 首次插上51单片机会弹出的授权窗口,点击同意权限,也可把默认勾选,这样插上设备,就会打开软件。 多个软件则会弹出这种授权选择窗口,一样选。
同意权限软件自动运行,气泡显示51回显消息“你好”,这是软件界面,非常简洁,啥都没有。
代码-AIDE
- 核心10行代码添加到MainActivity.java的onCreate方法里。
try
{
UsbManager Usb管理 = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbDevice Usb设备 = Usb管理. getDeviceList().values().iterator().next();
UsbEndpoint 发送节点 = Usb设备. getInterface(0).getEndpoint(1);
UsbEndpoint 接收节点 = Usb设备. getInterface(0).getEndpoint(0);
UsbDeviceConnection 连接= Usb管理. openDevice(Usb设备);
连接. controlTransfer(0x40, 0x9a, 0x1312, 0xB282, null, 0, 1000);
连接. bulkTransfer(发送节点, "你好".getBytes("GBK"),4, 1000);
byte[] 返回字节= new byte[4];
连接 .bulkTransfer(接收节点, 返回字节, 4, 1000);
Toast.makeText(this, new String(返回字节, "GBK"), Toast.LENGTH_LONG).show();
}
catch (Exception e){}
- MainActivity.Java中import 处加入这6项,代表导入包
import android.content.Context;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.widget.Toast;
- AndroidManifest.xml的文件的intent-filter意图过滤器,之间加入51单片机插入事件,这是插入单片机,手机弹出获取权限窗口的关键。
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
- 在AndroidManifest.xml文件的activity添加以下代码,此代码指向一个路径和文件名,这个文件存放可用的设备ID,第6部就是在指定路径添加这个文件。
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter"/>
- 在res资源文件夹下的,xml的文件夹下创建一device_filter.xml 来存放可用设备ID,只有这些ID才可以触发弹出权限窗口,如果ID为空或不正确,则任意设备都可触发弹窗。单片机设备ID可以通过电脑的设备管理器查看,不知道就不要填。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device
vendor-id="6790"
product-id="29987"/>
</resources>
|