更新记录

1.0.0(2023-05-16)

WCH 沁恒微电子串口通讯,USB转串口安卓免驱安装程序,支持CH340/CH341/CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104/CH9143的,用于Android操作系统4.4及以上版本的USB Host模式,无需加载Android内核驱动,无需root权限操作。 串口参数支持波特率、数据位、校验位、停止位、流控

流程:遍历当前连接的USB设备-》首先设置串口参数,包括波特率、数据位、停止位、奇偶校验位以及硬件流控等。之后设备就可以执行数据收发操作。


平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 12.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


前言

WCH 沁恒微电子串口通讯,USB转串口安卓免驱安装程序,支持CH340/CH341/CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104/CH9143的,用于Android操作系统4.4及以上版本的USB Host模式,无需加载Android内核驱动,无需root权限操作。 串口参数支持波特率、数据位、校验位、停止位、流控

流程:遍历当前连接的USB设备-》首先设置串口参数,包括波特率、数据位、停止位、奇偶校验位以及硬件流控等。之后设备就可以执行数据收发操作。

支持定制,QQ252797991


var wchChSerial = uni.requireNativePlugin("wrs-wchChSerial");

方法

  • 系统是否支持USB Host功能

                wchChSerial.usbFeatureSupported((resp) => {
                    var usbFeatureSupported = resp.usbFeatureSupported;
                    if (usbFeatureSupported) {
                        this.showToast("支持USB Host功能");
                    } else {
                        this.showToast("不支持USB Host功能");
                    }
                });
  • 当前所有符合要求的设备,显示设备列表

                wchChSerial.enumDevice((resp) => {
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if (code == 0) {
                        var devices = resp.devices;

                    } else {
                        this.showMsg(JSON.stringify(resp));
                        this.showToast("USB设备获取失败");
                    }
                });
  • 检查本库目前是否支持该硬件设备 GPIO 特性的配置,应当于操作 GPIO 前调用

                var params = {};
                params.deviceId = xxx;
                wchChSerial.isSupportGPIOFeature(params, (resp) => {
                    var code = resp.code;
                    if (code == 0) {
                        var isSupportGPIOFeature = resp.isSupportGPIOFeature;
                    } else {

                    }
                });
  • 获取该 UsbDevice 的芯片类型

                var params = {};
                params.deviceId = xxx;
                wchChSerial.getChipType(params, (resp) => {
                    var code = resp.code;
                    if (code == 0) {
                        var chipType = resp.chipType;
                    } else {

                    }
                });
  • 判断 USB 设备是否已经被打开

                var params = {};
                params.deviceId = xxx;
                wchChSerial.getChipType(params, (resp) => {
                    var code = resp.code;
                    if (code == 0) {
                        var isConnected = resp.isConnected;
                    } else {

                    }
                });
  • 获取设备的串口数目

                var params = {};
                params.deviceId = xxx;
                wchChSerial.getSerialCount(params, (resp) => {
                    var code = resp.code;
                    if (code == 0) {
                        // 串口总数
                        var serialNumber = resp.serialNumber;
                    } else {

                    }
                });
  • 打开 USB 设备

                var params = {};
                params.deviceId = this.deviceId;
                // 打开USB设备
                wchChSerial.openDevice(params, (resp) => {
                    var code = resp.code;
                    if (code == 0) {
                        var flag = resp.flag;
                        if (flag) {
                            // 打开成功

                        } else {
                            this.showMsg(JSON.stringify(resp));
                            this.showToast("打开USB设备失败");
                        }
                    } else {
                        if(code == -2) {
                            //没有权限打开该设备
                             //申请权限
                             wchChSerial.requestPermission({deviceId: this.deviceId});
                        } else {
                            this.showMsg(JSON.stringify(openResp));
                            this.showToast("打开USB设备失败");
                        }

                    }
                });
  • 注册串口数据回调

                var params = {};
                params.deviceId = this.deviceId;
                wchChSerial.registerDataCallback(params, (resp) => {
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if (code == 0) {
                        var serialNumber = resp.serialNumber;
                        var data = resp.data;
                        this.showToast("收到数据");
                    } 
                });
  • 取消注册串口数据回调

                var params = {};
                params.deviceId = xxx;
                wchChSerial.unRegisterDataCallback(params, (resp) => {
                    var code = resp.code;
                    if (code == 0) {
                        // 成功

                    } else {

                    }
                });
  • 请求 USB 设备的打开权限 申请读写权限

                var params = {};
                params.deviceId = this.deviceId;
                wchChSerial.requestPermission(wchChSerial, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if (code == 0) {
                        // 请求权限调用成功
                        // 权限结果通过monitorUSBState回调
                    }  else {
                        // 请求权限调用失败
                    }
                });
  • 注册 Modem 输入信号状态的回调

                var params = {};
                params.deviceId = this.deviceId;
                wchChSerial.registerModemStatusCallback(params, (resp) => {
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if (code == 0) {
                        var opt = resp.opt;
                        switch (opt) {
                            case "onStatusChanged":

                                break;
                            case "onOverrunError":
                                wchChSerial.querySerialErrorCount({
                                    deviceId: this.deviceId,
                                    serialErrorType: "overrun"
                                }, (resp) => {

                                });
                                break;
                            case "onParityError":
                                wchChSerial.querySerialErrorCount({
                                    deviceId: this.deviceId,
                                    serialErrorType: "parity"
                                }, (resp) => {

                                });
                                break;
                            case "onFrameError":
                                wchChSerial.querySerialErrorCount({
                                    deviceId: this.deviceId,
                                    serialErrorType: "frame"
                                }, (resp) => {

                                });
                                break;
                            default:
                                break;
                        }
                    } else {
                        this.showMsg("registerModemStatusCallback resp:" + JSON.stringify(resp));
                    }
                });
  • 查询串口错误状态

                                wchChSerial.querySerialErrorCount({
                                    deviceId: this.deviceId,
                                    serialErrorType: "parity" // frame、parity、overrun
                                }, (resp) => {
                                    var code = resp.code;
                                    if(code == 0) {
                                        // 出现错误的次数
                                        var count = resp.count;
                                    }
                                });
  • 监听设备的状态变化

            // 监测USB的状态
            wchChSerial.setUsbStateListener((resp) => {
                this.showMsg(JSON.stringify(resp));
                var opt = resp.opt;
                switch (opt) {
                    case "usbDeviceDetach":
                        //设备拔出
                        this.showMsg("设备拔出");
                        break;
                    case "usbDeviceAttach":
                        //设备插入
                        this.showMsg("设备插入");
                        break;
                    case "usbDevicePermission":
                        //请求打开设备权限结果
                        var result = resp.result;
                        this.showMsg("请求打开设备权限结果:" + result);
                        break;

                    default:
                        break;
                }
            });
  • 设置串口参数

                var params = {};
                params.deviceId = this.deviceId;
                params.serialNumber = index; // 串口号,即串口数目的序号
                params.baud = parseInt(this.serialCountArray[index].baud);// 波特率
                params.dataBit = 8; // 数据位 5,6,7,8
                params.stopBit = 1; // 停止位 1,2
                params.parityBit = 0; // 0 NONE;1 ODD;2 EVEN;3 MARK;4 SPACE
                params.flow = false; // 流控
                wchChSerial.setSerialParameter(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        var flag = resp.flag;
                        if(flag) {
                            // 发送成功
                            this.showToast("操作成功");
                        } else {
                            this.showToast("操作失败");
                        }
                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 设置 DTR 信号

                    var params = {};
                    params.deviceId = this.deviceId;
                    params.serialNumber = index; // 串口号
                    params.valid = true; // 是否有效(低电平有效)
                    wchChSerial.setDTR(params, (resp)=>{
                        this.showMsg(JSON.stringify(resp));
                        var code = resp.code;
                        if(code == 0) {
                            var flag = resp.flag;
                            if(flag) {
                                // 发送成功
                                this.showToast("操作成功");
                            } else {
                                this.showToast("操作失败");
                            }
                        } else {
                            this.showToast("操作失败");
                        }
                    });
  • 设置 RTS 信号

                    var params = {};
                    params.deviceId = this.deviceId;
                    params.serialNumber = index; // 串口号
                    params.valid = true; // 是否有效(低电平有效)
                    wchChSerial.setRTS(params, (resp)=>{
                        this.showMsg(JSON.stringify(resp));
                        var code = resp.code;
                        if(code == 0) {
                            var flag = resp.flag;
                            if(flag) {
                                // 发送成功
                                this.showToast("操作成功");
                            } else {
                                this.showToast("操作失败");
                            }
                        } else {
                            this.showToast("操作失败");
                        }
                    });
  • 设置 Break 信号

                    var params = {};
                    params.deviceId = this.deviceId;
                    params.serialNumber = index; // 串口号
                    params.valid = true; // 是否有效(低电平有效)
                    wchChSerial.setBreak(params, (resp)=>{
                        this.showMsg(JSON.stringify(resp));
                        var code = resp.code;
                        if(code == 0) {
                            var flag = resp.flag;
                            if(flag) {
                                // 发送成功
                                this.showToast("操作成功");
                            } else {
                                this.showToast("操作失败");
                            }
                        } else {
                            this.showToast("操作失败");
                        }
                    });
  • 发送串口数据

                var params = {};
                params.deviceId = this.deviceId;
                params.serialNumber = index; // 串口号
                params.data = "FAFB";
                wchChSerial.writeData(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        var flag = resp.flag;
                        if(flag) {
                            // 发送成功
                            this.showToast("操作成功");
                        } else {
                            this.showToast("操作失败");
                        }
                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 断开 USB 设备连接

                var params = {};
                params.deviceId = this.deviceId;
                wchChSerial.disconnect(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        // 成功
                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 关闭所有设备

                wchChSerial.closeAll((resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                         // 成功
                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 查询该 USB 设备的所有 GPIO 状态

                var params = {};
                params.deviceId = this.deviceId;
                wchChSerial.queryAllGPIOStatus(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        // 成功
                        var statuses = resp.statuses;
                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 查询该 USB 设备的某个 GPIO 状态

                var params = {};
                params.deviceId = this.deviceId;
                params.gpioIndex = 0;  // GPIO 序号
                wchChSerial.queryGPIOStatus(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        // 成功
                        var status = resp.status;
                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 使能该硬件设备的某个 GPIO 配置GPIO

                var params = {};
                params.deviceId = this.deviceId;
                params.gpioIndex = 0;  // GPIO 序号
                params.enable = true;// true 打开;false 关闭
                params.dir = 0; // 0: in  1: out
                wchChSerial.enableGPIO(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        var flag = resp.flag;
                        if(flag) {
                            // 成功
                        }
                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 获取该硬件设备的某个 GPIO 的电平值

                var params = {};
                params.deviceId = this.deviceId;
                params.gpioIndex = 0;  // GPIO 序号
                wchChSerial.getGPIOVal(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        var value = resp.value;

                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 设置该硬件设备的某个 GPIO 的电平值

                var params = {};
                params.deviceId = this.deviceId;
                params.gpioIndex = 0;  // GPIO 序号
                params.value = 0; // 0: low  1: high
                wchChSerial.setGPIOVal(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        var flag = resp.flag;
                        if(flag) {
                            // 成功
                        }
                    } else {
                        this.showToast("操作失败");
                    }
                });
  • 查询该 USB 设备的 GPIO 数量

                var params = {};
                params.deviceId = this.deviceId;
                wchChSerial.queryGPIOCount(params, (resp)=>{
                    this.showMsg(JSON.stringify(resp));
                    var code = resp.code;
                    if(code == 0) {
                        var count = resp.count;

                    } else {
                        this.showToast("操作失败");
                    }
                });

如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-feature android:name="android.hardware.usb.host" android:required="true" />

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件使用的 WCH 沁恒微电子 SDK会采集数据,详情可参考:https://www.wch.cn/about_us.html

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问