返回> 网站首页
USBHID - CP2110/CP2114在android手机上的开发
yoours2024-02-07 15:03:18
简介一边听听音乐,一边写写文章。
一、介绍
由于 libusb、slabhiddevice、slabhidtouart 在普通手机上没有权限,所以不能正常使用。
在此使用java在普通android手机上进行usb hid开发,连接CP2110设备最终实现正常通讯。
本人使用的是一个基于CP2110的Uhf900M发卡器,经测试获取功率以及标签盘点正常。
二、核心配置方法
配置发送数据必须为64字节长度,未使用部分补零。
1. 该芯片在正常使用之前需要配置串口工作模式
byte[] report = new byte[FEATURE_REPORT_LENGTH];
Arrays.fill(report, (byte)0);
report[0] = 0x41; // Report ID
report[1] = 1; // Enable option
if (hid_send_feature_report(report, FEATURE_REPORT_LENGTH) == HID_DEVICE_SUCCESS) {
status = HID_UART_SUCCESS;
}
2. 配置串口波特率、位数、停止位等常规串口参数
byte[] report = new byte[FEATURE_REPORT_LENGTH];
Arrays.fill(report, (byte)0);
report[0] = 0x50; // Report ID
report[1] = (byte) (baudRate >> 24); // Baud rate (big-endian)
report[2] = (byte) (baudRate >> 16);
report[3] = (byte) (baudRate >> 8);
report[4] = (byte) (baudRate);
report[5] = parity; // Parity
report[6] = flowControl; // Flow Control
report[7] = dataBits; // Data Bits
report[8] = stopBits; // Stop Bits
if (hid_send_feature_report(report, FEATURE_REPORT_LENGTH) == HID_DEVICE_SUCCESS) {
status = HID_UART_SUCCESS;
}
三、收发数据核心代码
1. 发送数据 - 使用输出端点
发送数据为数组格式,第一个字节固定为数据长度。
int bytesRead = mConnection.bulkTransfer(mOutUsbEndpoint, btTmp, size+1, timeout);
if (bytesRead!=-1 && bytesRead <= size+1) {
return 1;
}
2. 接收数据 - 使用输入端点
接收到的数据为数组格式,同样第一个字节固定为数据长度
int bytesRead = mConnection.bulkTransfer(mInUsbEndpoint, buffer, size, timeout);
if (bytesRead!=-1 && bytesRead <= size) {
buffer = Arrays.copyOfRange(buffer, 0, bytesRead);
return buffer;
}
四、配置核心代码
byte hid_send_feature_report(byte[] data, int length)
{
int report_id = data[0];
int res = mConnection.controlTransfer(
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,
0x09/*HID set_report*/,
(3/*HID feature*/ << 8) | report_id,
0/*dev->interface*/,
data, length,
1000/*timeout millis*/);
if (res < 0)
return -1;
return HID_DEVICE_SUCCESS;
}
byte hid_get_feature_report(byte[] data, int length)
{
int report_id = data[0];
int res = mConnection.controlTransfer(
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN,
0x01/*HID get_report*/,
(3/*HID feature*/ << 8) | report_id,
0/*interface*/,
data, length,
1000/*timeout millis*/);
if (res < 0)
return -1;
return HID_DEVICE_SUCCESS;
}