更新记录

1.0.9(2023-05-22)

  1. 优化SDK和demo
  2. 增加串口接口

1.0.8(2022-11-16)

  1. 增加root权限执行cmd命令

1.0.7(2022-11-15)

适配最新基座混淆问题

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 11.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原生插件配置”->”云端插件“列表中删除该插件重新选择


前言

android串口通讯,支持root或无root权限系统,支持多个串口收发数据,串口参数支持波特率、数据位、校验位、停止位、流控 此插件大部分用于嵌入式Android定制主板系统中(如Android TV等), 如果是手机上type-c等otg转USB ttl串口,请使用:

WCH沁恒微电子USB转串口CH340CH341CH342CH343等新版

https://ext.dcloud.net.cn/plugin?id=12400

OTG USB串口、CP210X、CDC、FTDI、PL2303、CH34X等

https://ext.dcloud.net.cn/plugin?id=12157

串口通讯(云小帆otg转TTL串口)USB-OTG-CH340-UART

https://ext.dcloud.net.cn/plugin?id=9924

支持定制,QQ252797991

wrs-serialport组件


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

方法

  • 检查Android 6 以后的动态读写权限,已经弃用,采用unaipp自带的API来检查权限,见demo

    serialport.checkPermission((resp) => {
                    var str = JSON.stringify(resp);
                    this.receiveData = str;
    });
  • 获取所有串口

方式1:(推荐使用)


                var params = {};
                // params.dir = "/proc/tty/drivers"; 默认获取的是/proc/tty/drivers路径下的所有串口
                serialport.getSerialPorts(params, (resp) => {
                    var devices = resp.devices;
                    if (devices.length > 0) {
                        var length = devices.length;
                        var itemList = [];
                        for (var i = 0; i < length; i++) {
                            var device = devices[i];
                            var title = device.path;
                            itemList.push(title);
                        }
                        this.showActionSheet(itemList, (index) => {
                            var path = devices[index].path;
                            if (callBack) {
                                callBack(path);
                            }
                        });
                    } else {
                        this.showMsg("/proc/tty/drivers路径下没有获取到串口,尝试修改dir参数");
                        this.showToast("/proc/tty/drivers路径下没有获取到串口,尝试修改dir参数");
                    }
                });

方式2:(老接口,不推荐使用)


    // 驱动为:/proc/tty/drivers 串口路径为:/dev
    var sps = serialport.getAllSerialport();
                if(isString(sps)) {
                    sps = JSON.parse(sps);
                }
                console.log(JSON.stringify(sps));
                var devices = sps.devices;
  • 打开串口

方式1:(推荐使用)


                var params = {};
                params.path = this.path;
                params.baudRate = parseInt(this.baudRate); // 波特率, 默认9600
                // params.dataBits = 8;//  数据位,值范围:5,6,7,8
                // params.parity = 0;// 校验位,值范围:0(不校验)、1(奇校验)、2(偶校验)、3(空校验)
                // params.stopBits = 1; // 停止位,值范围:1、2
                // params.flowCon = 0; // 流控,值范围:0(不使用流控)、1(硬件流控RTS/CTS)、2(软件流控XON/XOFF)
                // params.dataType = 0; // 设置收到数据的返回类型 0:  十六进制数字返回 1: 十六进制字符串返回 3:采用charsetName参数的转码返回
                // params.charsetName = "UTF_8"; // dataType为3时生效,支持UTF_8、US_ASCII、ISO_8859_1、UTF_16、UTF_16BE、UTF_16LE
                // params.sh = "/system/bin/su";
                // params.needChmod = true; // true: 当串口没有读写权限时会采用/system/bin/su chmod 777 /dev/ttyS2来修改串口权限,系统需要root权限
                serialport.openSP(params, (resp) => { // 打开串口回调
                    console.log(JSON.stringify(resp));
                    var title = "";
                    if (resp.flag) {
                        title = "打开成功";
                    } else {
                        title = "打开失败," + resp.msg;
                    }
                    this.showMsg(title);
                }, (resp) => { // 串口发送数据回调
                    var respStr = JSON.stringify(resp);
                    console.log("数据发送成功:" + respStr);
                }, (resp) => { // 串口收到数据回调
                    console.log(JSON.stringify(resp));

                    var respStr = JSON.stringify(resp);
                    var str = dataUtils.arrayBufferToHexStr(resp.data)
                    if (this.receiveData == null) {
                        this.receiveData = str;
                    } else {
                        this.receiveData += "\n" + str;
                    }
                    console.log("收到串口数据:" + str);

                });

方式2:(老接口,不推荐使用)


                var params = {};
                params.path = this.path;
                var baudRateValue = 9600;
                if(this.baudRate != null) {
                    baudRateValue = parseInt(this.baudRate)
                }
                params.baudRate = baudRateValue; // 波特率, 默认9600
                params.needChmod = false; // 当串口没有读写权限时,是否调用chmod 777命令修改读写权限,需要root权限才能执行
                // params.dataBits = 8;//  数据位,值范围:5,6,7,8
                // params.parity = 0;// 校验位,值范围:0(不校验)、1(奇校验)、2(偶校验)、3(空校验)
                // params.stopBits = 1; // 停止位,值范围:1、2
                // params.flowCon = 0; // 流控,值范围:0(不使用流控)、1(硬件流控RTS/CTS)、2(软件流控XON/XOFF)
                // params.needChmod = true; // 当此串口读写权限时,是否使用chmod 777指令修改权限,需要root权限系统 
                serialport.open(params, (resp) => { // 打开串口回调
                    var title = "";
                    if (resp.flag) {
                        title = "打开成功";
                    } else {
                        title = "打开失败," + resp.msg;
                    }
                    uni.showModal({
                        title: title,
                        success: function(res) {

                        }
                    });
                }, (resp) => { // 串口发送数据回调
                    var respStr = JSON.stringify(resp);
                    console.log("数据发送成功:" + respStr);
                }, (resp) => { // 串口收到数据回调
                    var respStr = JSON.stringify(resp);
                    var str = dataUtils.arrayBufferToHexStr(resp.data)
                    if(this.receiveData == null) {
                        this.receiveData = str;
                    } else {
                        this.receiveData += "\n" + str;
                    }
                    console.log("收到串口数据:" + str);

                });
  • serialport.close(params, callback) 关闭串口

                var params = {};
                params.path = this.path;
                serialport.close(params, (resp) => {
                    console.log("串口已关闭");
                });
  • serialport.sendData(params) 发送数据

                var array = new Array();
                // array.push(0xFA);
                // array.push(0xFB);
                dataUtils.addHexStrToArray(this.data, this.data.length/2, array);        
                var params = {};
                params.path = this.path;
                params.data = array; // data可以是十六进制的数组,如上面的array,也可以是十六进制的字符串,如“FAFB”
                serialport.sendData(params);
  • serialport.sendHex(params) 发送十六进制数据

                var params = {};
                params.path = this.path;
                params.data = “FAFB”; 
                serialport.sendHex(params);
  • serialport.sendBytes(params) 发送字节数据

                var array = new Array();
                array.push(0xFA);
                array.push(0xFB);
                var params = {};
                params.path = this.path;
                params.data = array; 
                serialport.sendBytes(params);
  • serialport.getSerialportState(params) 查询串口状态

                var params = {};
                params.path = this.path;
                var resp = serialport.getSerialportState(params)
                if(isString(resp)) {
                     resp = JSON.parse(resp);
                }

                var state = resp.state; // 0: 串口没有打开 1: 串口打开了
  • 检查读权限

                serialport.canRead({
                    path: this.path
                }, (resp)=>{
                    var canRead = resp.canRead;
                    if(canRead) {
                        this.showMsg("可读");
                    } else {
                        this.showMsg("不可读");
                    }
                });
  • 检查写权限

                serialport.canWrite({
                    path: this.path
                }, (resp)=>{
                    var canWrite = resp.canWrite;
                    if(canWrite) {
                        this.showMsg("可写");
                    } else {
                        this.showMsg("不可写");
                    }
                });
  • 执行cmd命令

                // 一般用来串口读写权限不够时,在打开串口之前提前使用cmd命令来改变权限
                serialport.executeCmd({
                    cmd: "chmod 777 " + this.path
                    // needWaitFor: true // 是否等待命令执行完
                }, (resp)=>{
                    var flag = resp.flag;
                    if(flag) {
                        this.showMsg("cmd执行成功");
                    } else {
                        this.showMsg("cmd执行失败:" + resp.msg);
                    }
                });
  • root权限执行cmd命令

                // 一般用来串口读写权限不够时,在打开串口之前提前使用cmd命令来改变权限,需要root权限
                serialport.executeRootCmd({
                    cmd: "chmod 777 " + this.path
                    // needWaitFor: true // 是否等待命令执行完
                    // suPath: "/system/bin/su" // su命令路径,一般不需要指定
                }, (resp)=>{
                    var flag = resp.flag;
                    if(flag) {
                        this.showMsg("cmd执行成功");
                    } else {
                        this.showMsg("cmd执行失败:" + resp.msg);
                    }
                });
  • 检查串口是否存在

                serialport.exists({
                    path: this.path
                }, (resp)=>{
                    var exists = resp.exists;
                    if(exists) {
                        this.showMsg("存在");
                    } else {
                        this.showMsg("不存在");
                    }
                });

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

隐私、权限声明

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

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

插件不采集任何数据

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

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