因为第一次接触Android下的串口开发,在网上找了很多例子都不能满足自己的需要以及不能正常使用,于是结合网上的资源以及查阅资料,终于完成了关于这个串口的开发,在此记录下usb转串口通信开发的过程。
Android串口开发步骤总共分为四大类,如下
1. 权限获取
2. 发现打开串口
3. 串口操作(发送与读取)
4. 关闭串口
一、权限获取
首先我们需要在AndroidMainfest.xml文件中配置USB使用权限
<uses-feature android:name="android.hardware.usb.host" />
并在我们的Activity标签中配置intent-filter
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
resource资源为res资源文件夹下的xml文件下的device_filter.xml文件。device_filter.xml文件是我们需要知道我们USB设备硬件的vendor-id和product-id。文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device
vendor-id="xxxx"
product-id="xxxx"/>
</resources>
其中vendor-id以及product-id我们可以通过计算机管理 -> 电脑电脑设备管理器,Android Phone 查看详细信息,属性选择硬件ID。
二、发现打开串口
首先我们需要获取到UsbManager管理类,通过此类的getDeviceList()方法得到包含所有已连接的USB设备的列表。最后,通过设备名称来得到给设备对象。
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceMap = usbManager.getDeviceList();
UsbDevice device = deviceMap.get("deviceName");
上面是获取指定的串口设备,如果你想获取到所有的可以通过usbManager.getDeviceList().values();获取在foreach循环迭代拿到每一个设备。
当我们获取到一个设备之后,我们首先要判断是否有该权限,通过usbManager.hasPermission(device)
判断是否有该权限。当有权限我们就可以打开串口设备以及对他设置波特率、检验位等参数信息。
private void permissionAllow(UsbDevice device) {
List<UsbSerialPort> result = new ArrayList<>();
for (final UsbSerialDriver driver : drivers) {
final List<UsbSerialPort> ports = driver.getPorts();
result.addAll(ports);
}
UsbDeviceConnection usbDeviceConnection = usbManager.openDevice(device);
try {
serialPort = result.get(0);
serialPort.open(usbDeviceConnection);
// 第一个参数为波特率 第二个为停止位 第三个为奇偶校验,具体的应该根据自己的协议来配置
serialPort.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
} catch (IOException e) {
e.printStackTrace();
}
UsbInterface anInterface = device.getInterface(0);
if (anInterface == null) {
Toast.makeText(this, "初始化失败", Toast.LENGTH_SHORT).show();
return;
}
// 判断端口号
for (int i = 0; i < anInterface.getEndpointCount(); i++) {
UsbEndpoint endpoint = anInterface.getEndpoint(i);
if (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
// 输入端口
usbEndpointIn = endpoint;
} else if (endpoint.getDirection() == UsbConstants.USB_DIR_OUT) {
// 输出端口