返回> 网站首页 

USBHID - CP2110/CP2114在android手机上的开发

yoours2024-02-07 15:03:18 阅读 816

简介一边听听音乐,一边写写文章。

一、介绍

    由于 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;

    }


微信小程序扫码登陆

文章评论

816人参与,0条评论