WUP-CH34X ch34x系列芯片USB转串口通信uniapp插件使用说明

插件地址:WUP-CH34X 系列芯片USB转串口通信安卓库

简介

本文档是针对 CH340/CH341/CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104/CH9143的 USB 转串口安卓库的开发说明文档。

主要介绍如何使用芯片的 USB 转异步串口功能(以下简称 CH34XUART),以及 Android 下如何使用 APK 操作实现串口通讯。该功能基于 Android USB Host 协议完成,用户可调用相关的接口 API 实现与 Android 设备进行通讯。

CH34X 串口库提供的 Android 接口需要基于 Android 5.0 及以上版本系统,使用 CH34X 串口库 Android
驱动条件:

  1. 基于 Android 5.0 及以上版本系统
  2. Android 设备具有 USB Host 或 OTG 接口
    在这里插入图片描述

前言

插件目前不支持uniapp x,这个暂时没搞明白是uniapp x兼容问题还是我写法有问题,有android.hardware.usb.UsbDevice开发经验的可以评论区交流一下。

插件支持uniapp的vue2和vue3版本

本插件只支持单USB设备转单串口和单USB设备转多串口

在这里插入图片描述
在这里插入图片描述

方法引入

import { sayHiParam, 需引入的其他方法 } from "@/uni_modules/WUP-CH34X";	

定义设备索引

定义一个数字类型用于存储,使用的设备索引

data() {return {deviceInx: 0,}
},

方法

插件测试方法

sayHiParam ("wup-ch34x", (res) => {console.log(res)  // {"code":0,"msg":"hi wup-ch34x"}
})

获取所有符合要求的USB设备列表

获取设备后可以根据设备参数选择所需的设备(参数根据自己实际情况进行调整)或者根据用户选择的设备,记录下设备索引

enumDevice(function (res) {for (let i = 0; i < res.devices.length; i++) {// 设备索引 i}
})

打开选择的USB设备

  • deviceInx: 设备索引,来源设备列表
openDevice(deviceInx, function (res) {console.log("open", res)
})

关闭选择的USB设备

  • deviceInx: 设备索引,来源设备列表
closeDevice(deviceInx, (res) => {console.log("close", res)
})

关闭所有USB设备

closeAllDevice((res) => {console.log("closeAll", res)
})

设置打开的设备串口参数

  • serialNumber:串口号,注意这个串口号不是设备参数中的,而是设备的串口序号,单设备单串口默认:0;单设备多串口:0,1,2,···
  • baud:串口波特率
  • dataBit:数据位 5,6,7,8
  • stopBit:停止位 1,2
  • parityBit:校验位 0 NONE;1 ODD;2 EVEN;3 MARK;4 SPACE
  • flow:流 true 开启,false 关闭
setSerialParameter(serialNumber, baud, dataBit, stopBit, parityBit, flow, (res) => {console.log("setSerialParameter", res)
})

发送串口数据

  • serialNumber:串口号,注意这个串口号不是设备参数中的,而是设备的串口序号,单设备单串口默认:0;单设备多串口:0,1,2,···
  • commandStr:十六进制命令字符串,如:574B4C590900820183
  • timeout:超时时间,单位:毫秒
writeData(serialNumber, commandStr, timeout, (res) => {console.log("writeData", res)
})

主动读取串口数据(不推荐)

该方法读取缓冲区数据,缓冲区数据会累积,所以如果间隔一次不读取,会把两次累积的数据一起读取出来,这个需要自行做处理。

  • serialNumber:串口号,注意这个串口号不是设备参数中的,而是设备的串口序号,单设备单串口默认:0;单设备多串口:0,1,2,···
  • timeout:超时时间,可以根据返回的数据长度做调整,避免数据读取不全,单位:毫秒
readData(serialNumber, timeout, (re) => {console.log("readData", re)
})

注册串口数据回调(推荐)

该方法注册监听成功后会有数据回调,监听到有串口数据后也会回调(含串口号serialNumber和串口数据data),在使用过程中注意区分。

  • timeout:超时时间,可以根据返回的数据长度做调整,避免数据读取不全,插件限制不小于200,单位:毫秒
registerDataCallback(timeout, (res) => {console.log("registerDataCallback", res)
})

注册成功

{"code":0,"msg":"register data callback successful"}

串口数据返回

{"data":"574B4C590B008····","code":0,"msg":"data callback successful","serialNumber":0}

解除注册串口数据回调

removeDataCallback((res) => {console.log("removeDataCallback", res)
})

监听设备状态变化

所有符合条件的设备,不只是打开的设备

setUsbStateListener(function (res) {console.log("setUsbStateListener", res)
})

数据返回说明

返回的数据中除了基本信息外,还包括设备信息device,以及状态信息status,status有以下三种状态:

  • 10:设备拔出
  • 20:设备插入
  • 30:设备权限请求结果

判断USB设备是否已经打开

  • deviceInx: 设备索引,来源设备列表
isConnected(deviceInx, function (res) {console.log("isConnected", res)
})

获取所有已经打开的USB设备

getConnectedDevices((res) => {console.log("getConnectedDevices", res)
})

获取打开的USB设备的芯片类型

getChipType((res) => {console.log("getChipType", res)
})

获取打开的USB设备的串口数量

getSerialCount((res) => {console.log("getSerialCount", res)
})

示例代码

<template><view><view style="margin-top: 50px;padding: 0 15px;"><button @click="enumDevice" type="primary" style="margin-bottom: 15px;">设备列表</button><button @click="openDevice" type="primary" style="margin-bottom: 15px;">打开设备</button><button @click="closeDevice" type="warn" style="margin-bottom: 15px;">关闭设备</button><button @click="closeAllDevice" type="warn" style="margin-bottom: 15px;">关闭所有设备</button><button @click="setSerialParameter" type="primary" style="margin-bottom: 15px;">设置串口</button><button @click="registerDataCallback" type="primary" style="margin-bottom: 15px;">监听串口数据</button><button @click="writeData" type="primary" style="margin-bottom: 15px;">写串口数据</button><button @click="writeData1" type="primary" style="margin-bottom: 15px;">读写串口数据</button><button @click="isCon" type="primary" style="margin-bottom: 15px;">设备状态</button><button @click="getConnectedDevices" type="primary" style="margin-bottom: 15px;">已连接设备</button><button @click="getChipType" type="primary" style="margin-bottom: 15px;">设备芯片类型</button><button @click="getSerialCount" type="primary" style="margin-bottom: 15px;">设备串口数</button><button @click="removeDataCallback" type="primary" style="margin-bottom: 15px;">移除串口监听</button></view><view style="padding: 15px 30px;">{{msg}}</view></view>
</template><script>import { closeAllDevice, closeDevice, enumDevice, getChipType, getConnectedDevices, getSerialCount, isConnected, openDevice, readData, registerDataCallback, removeDataCallback, sayHi, sayHiParam, sayHiSync, setSerialParameter, setUsbStateListener, writeData } from "@/uni_modules/WUP-CH34X";	export default {data() {return {msg: "",deviceInx: 0,}},onLoad() {let that = thissetUsbStateListener(function (res) {that.msg = JSON.stringify(res)console.log("setUsbStateListener", res)})},methods: {removeDataCallback () {let that = thisremoveDataCallback((res) => {that.msg = JSON.stringify(res)console.log("removeDataCallback", res)})},getSerialCount () {let that = thisgetSerialCount((res) => {that.msg = JSON.stringify(res)console.log("getSerialCount", res)})},getChipType () {let that = thisgetChipType((res) => {that.msg = JSON.stringify(res)console.log("getChipType", res)})},getConnectedDevices () {let that = thisgetConnectedDevices((res) => {that.msg = JSON.stringify(res)console.log("getConnectedDevices", res)})},isCon () {let that = thisisConnected(that.deviceInx, function (res) {that.msg = JSON.stringify(res)console.log("isConnected", res)})},enumDevice () {let that = thisenumDevice(function (res) {that.msg = JSON.stringify(res)for (let i = 0; i < res.devices.length; i++) {// 根据设备信息区分设备,自动选择设备// CH344Q设备// if (res.devices[i].mVendorId == 6790 && res.devices[i].mProductId == 21973) {// that.deviceInx = i// console.log("deviceInx", that.deviceInx)// }// CH340设备if (res.devices[i].mVendorId == 6790 && res.devices[i].mProductId == 29987) {that.deviceInx = iconsole.log("deviceInx", that.deviceInx)}}console.log("devices", res)})},openDevice () {let that = thisopenDevice(that.deviceInx, function (res) {that.msg = JSON.stringify(res)console.log("open", res)})},closeDevice () {let that = thiscloseDevice(that.deviceInx, (res) => {that.msg = JSON.stringify(res)console.log("close", res)})},closeAllDevice () {let that = thiscloseAllDevice((res) => {that.msg = JSON.stringify(res)console.log("closeAll", res)})},setSerialParameter () {let that = thissetSerialParameter(0, 9600, 8, 1, 0, false, (res) => {that.msg = JSON.stringify(res)console.log("setSerialParameter", res)})},writeData () {let that = thiswriteData(0, "574B4C590900820183", 2000, (res) => {console.log("writeData", res)that.msg = JSON.stringify(res)})},writeData1 () {let that = thiswriteData(0, "574B4C590900820183", 2000, (res) => {console.log("writeData1", res)that.msg = JSON.stringify(res)readData(0, 500, (re) => {that.msg = JSON.stringify(res) + JSON.stringify(re)console.log("readData", re)})})},registerDataCallback () {let that = thisregisterDataCallback(200, (res) => {console.log("registerDataCallback", res)that.msg = JSON.stringify(res)})}}}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396617.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

循环神经网络三

一.介绍 在普通的神经网络中&#xff0c;信息的传递是单向的&#xff0c;这种限制虽然使得网络变得更容易学习&#xff0c;单在一定程度上也减弱了神经网络模型的能力。特别是在现实生活中&#xff0c;网络的输出不仅和当前时刻的输入相关&#xff0c;也过去一段时间的输出相关…

Typora 伪装 LaTeX 中文样式主题 学习笔记

最近发现一个比较有意思的项目&#xff0c;Typora 伪装 LaTeX 中文样式主题 用来写毕设论文的初稿&#xff0c;格式可以统一控制&#xff0c;比较方便。项目“第五章”源格式是“5 系统测试”靠左&#xff0c;就像5.1一样。搜索了一下获得了一些零散的知识点记下来。 在Typora的…

Linux C 程序 【04】线程分离

1.开发背景 Linux 线程区分于FreeRTOS&#xff0c;线程的属性形态有2中&#xff0c;在 pthread.h 中有注解&#xff0c;如下。 /* Detach state. */ enum {PTHREAD_CREATE_JOINABLE, #define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLEPTHREAD_CREATE_DETACHED #defin…

Jenkins保姆笔记(2)——基于Java8的Jenkins插件安装

前面我们介绍过&#xff1a; Jenkins保姆笔记&#xff08;1&#xff09;——基于Java8的Jenkins安装部署 本篇主要介绍下基于Java8的Jenkins插件安装。为什么要单独讲一个插件安装&#xff1f;因为一些原因&#xff0c;Jenkins自带的插件源下载几乎都会失败&#xff0c;如图…

【vulhub靶场之thinkphp】——(5-rce)

第一步&#xff1a;打开靶场 输入开启命令 cd vulhub/thinkphp/5-rce docker-compose up -d docker-compose ps//查看开启的端口 第二步&#xff1a; 访问网址 第三步&#xff1a;漏洞利用 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖&am…

24/8/6算法笔记 支持向量机

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种监督学习算法&#xff0c;主要用于分类和回归任务。它基于统计学习理论中的结构风险最小化原理&#xff0c;通过找到数据点之间的最优边界来实现模型的泛化能力。 import numpy as np import matplotlib.…

Android 下载安装配置

文章目录 Android Studio 下载安装配置1. 下载JDK2. JDK环境配置&#xff1a;3. 测试JDK是否安装成功&#xff1a;4. 下载Android Studio:5. 配置Android Studio:6. android studio提速方法1&#xff08;不行&#xff09;方法2&#xff1a;(很行&#xff09; Android Studio 下…

STL容器之vector

1.vector的介绍及使用 1.1vector的介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可…

快速基于 ClickHouse + Grafana 搭建可观测性解决方案 - 分布式链路追踪篇(ClickHouse 官方博客)...

引言 在 ClickHouse&#xff0c;我们认为可观测性仅仅是另一个实时分析问题。作为一款高性能的实时分析数据库&#xff0c;ClickHouse 被用于多种场景&#xff0c;包括时间序列数据的实时分析。其应用场景的多样性推动了大量分析函数的发展&#xff0c;这些函数有助于查询大多数…

【Python】PyWebIO 初体验:用 Python 写网页

目录 前言1 使用方法1.1 安装 Pywebio1.2 输出内容1.3 输入内容 2 示例程序2.1 BMI 计算器2.2 Markdown 编辑器2.3 聊天室2.4 五子棋 前言 前两天正在逛 Github&#xff0c;偶然看到一个很有意思的项目&#xff1a;PyWebIo。 这是一个 Python 第三方库&#xff0c;可以只用 P…

Atcoder Beginner Contest 366

传送门 A - Election 2 时间限制&#xff1a;2秒 内存限制&#xff1a;1024MB 分数&#xff1a;100分 问题描述 在 AtCoder 市举行市长选举。候选人是 Takahashi 和 Aoki。 目前有 N 张有效选票投给了这两个候选人&#xff0c;并且计票正在进行中。这里&#xff0…

配置Cuttlefish 虚拟 Android 设备

google 参考资料&#xff1a; https://source.android.com/docs/setup/start?hlzh-cn https://source.android.com/docs/devices/cuttlefish/get-started?hlzh-cn Cuttlefish 开始 验证 KVM 可用性 Cuttlefish 是一种虚拟设备&#xff0c;依赖于宿主机上可用的虚拟化。 …

Laravel 使用Excel导出的文件中,指定列数据格式为日期,方便后期的数据筛选操作

背景 最近&#xff0c;后台运营人员要求导出的 Excel 文件&#xff0c; 要求能够满足对于 [下单日期] 的筛选操作&#xff0c;即满足在年份、月份上的选择 通过了解&#xff0c;发现&#xff1a; 先前导出的文件&#xff0c;默认列数据都是字符串&#xff08;文本&#xff09;格…

bia文件中码偏差对实时PPP解算分析

1. 码偏差对定位影响 码偏差对未知收敛时间有影响&#xff0c;对最终精度影响不大&#xff08;权比1000:1&#xff09;

前端工程化14-git merge 以及 git rebase。

rebase会把当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像从公共分支又重新拉出来这个分支一样。 举例&#xff1a; 如果从 master 拉个feature分支出来,然后提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的…

【Hot100】LeetCode—295. 数据流的中位数

目录 1- 思路① 添加元素实现② 计算实现 2- 实现⭐295. 数据流的中位数——题解思路 原题链接&#xff1a;295. 数据流的中位数 1- 思路 利用优先级队列实现一个大顶堆和一个小顶堆大顶堆用来存放较小的元素&#xff0c;小顶堆用来存放较大的元素 ① 添加元素实现 如果当前…

JVM知识总结(双亲委派机制)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 双亲委派机制 双亲委派类加载过程 当App尝试加载一个类时&#x…

haproxy基础

HAProxy (High Availability Proxy) 是一款强大的开源负载均衡器和代理服务器。它主要用于提高 Web 应用程序和服务的可用性和性能。HAProxy 可以在 TCP 和 HTTP 层面上工作&#xff0c;并且支持多种负载均衡算法&#xff0c;广泛应用于高流量网站和大型分布式系统中。 社区版…

【数学建模】简单的优化模型-6 血管分支

背景&#xff1a;机体提供能量维持血液在血管中的流动&#xff0c;给血管壁以营养&#xff1b;克服血液流动的阻力&#xff0c;能量消耗与血管的几何形状有关。在长期进化中动物血管的几何形状已经在能量消耗最小原则下达到最优化。 问题&#xff1a;在能量消耗最小原则下&…

现代卷积神经网络

经典的CNN架构 一、早期的CNN架构 LeNet LeNet&#xff0c;&#xff08;也称为LeNet-5&#xff0c;5代表使用了2个卷积层和3个全连接层&#xff09;是一个经典的卷积神经网络架构&#xff0c;最初由Yann LeCun等人开发用于MNIST数据集手写数字&#xff08;灰度图像 输入通道…