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

news2024/11/15 15:38:24

插件地址: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 = this
			setUsbStateListener(function (res) {
				that.msg = JSON.stringify(res)
				console.log("setUsbStateListener", res)
			})
		},
		methods: {
			removeDataCallback () {
				let that = this
				removeDataCallback((res) => {
					that.msg = JSON.stringify(res)
					console.log("removeDataCallback", res)
				})
			},
			getSerialCount () {
				let that = this
				getSerialCount((res) => {
					that.msg = JSON.stringify(res)
					console.log("getSerialCount", res)
				})
			},
			getChipType () {
				let that = this
				getChipType((res) => {
					that.msg = JSON.stringify(res)
					console.log("getChipType", res)
				})
			},
			getConnectedDevices () {
				let that = this
				getConnectedDevices((res) => {
					that.msg = JSON.stringify(res)
					console.log("getConnectedDevices", res)
				})
			},
			isCon () {
				let that = this
				isConnected(that.deviceInx, function (res) {
					that.msg = JSON.stringify(res)
					console.log("isConnected", res)
				})
			},
			enumDevice () {
				let that = this
				enumDevice(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 = i
							console.log("deviceInx", that.deviceInx)
						}
					}
					console.log("devices", res)
				})
			},
			openDevice () {
				let that = this
				openDevice(that.deviceInx, function (res) {
					that.msg = JSON.stringify(res)
					console.log("open", res)
				})
			},
			closeDevice () {
				let that = this
				closeDevice(that.deviceInx, (res) => {
					that.msg = JSON.stringify(res)
					console.log("close", res)
				})
			},
			closeAllDevice () {
				let that = this
				closeAllDevice((res) => {
					that.msg = JSON.stringify(res)
					console.log("closeAll", res)
				})
			},
			setSerialParameter () {
				let that = this
				setSerialParameter(0, 9600, 8, 1, 0, false, (res) => {
					that.msg = JSON.stringify(res)
					console.log("setSerialParameter", res)
				})
			},
			writeData () {
				let that = this
				writeData(0, "574B4C590900820183", 2000, (res) => {
					console.log("writeData", res)
					that.msg = JSON.stringify(res)
				})
			},
			writeData1 () {
				let that = this
				writeData(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 = this
				registerDataCallback(200, (res) => {
					console.log("registerDataCallback", res)
					that.msg = JSON.stringify(res)
				})
			}
			
		}
	}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 使用正则表达式判断图片路径是否是超链接

在Python中&#xff0c;判断一个给定的字符串&#xff08;假设为图片路径&#xff09;是否是网页链接&#xff08;URL&#xff09;&#xff0c;你可以通过检查该字符串是否符合URL的基本格式来实现。虽然这个方法不能保证链接一定指向图片&#xff0c;但它能判断该字符串是否是…

La-Z-Boy EDI项目测试流程详解

在此前的文章《家居EDI&#xff1a;La-Z-Boy EDI 项目案例》中&#xff0c;为大家介绍了La-Z-Boy的EDI 需求以及在知行之桥EDI系统中的具体实现&#xff0c;本文主要为大家介绍La-Z-Boy EDI项目测试流程。 梳理需求文档 La-Z-Boy 提供的EDI资料主要包括&#xff1a;EDI 850订…

在IntelliJ IDEA中利用Git拉取项目

1 访问gitee或github&#xff0c;找到项目对应的仓库&#xff0c;并复制仓库地址。 2 打开IDEA&#xff0c;依次选择菜单:File->New->Project from Version Control 3 在弹出框中输入仓库路径(从第一步中gitee或github复制的路径)并点击Clone 4 在弹出框中输入gite…

Mybatis框架——使用案例详细教程

文章目录 一、项目创建1.1 创建 Idea 项目1.2 导入必要依赖 二、数据库配置2.1 创建数据库2.2 配置数据库连接信息 三、MyBatis 配置3.1 创建配置文件 mybatis-config.xml3.2 创建 SqlSessionFactory 实例 四、项目测试和运行4.1 创建实体类4.2 创建 mapper.xml 文件4.3 创建 m…

CentOS7安装Docker教程(含最新镜像地址)

文章目录 1 安装前必读2 安装Docker的详细步骤3 配置镜像加速 1 安装前必读 在安装 Docker 之前&#xff0c;先说一下配置&#xff0c;我这里是Centos7 Linux 内核&#xff1a;官方建议 3.10 以上&#xff0c;3.8以上貌似也可。 注意&#xff1a;本文的命令使用的是 root 用户…

UE基础 —— 工具和编辑器

目录 Level Editor Static Mesh Editor Material Editor Blueprint Editor Physics Asset Editor Behavior Tree Editor Niagara Editor UMG UI Editor Font Editor Sequencer Editor Animation Editor Control Rig Editor Sound Cue Editor Media Editor nDisp…

JUC-变量的线程安全

成员变量和静态变量是否线程安全&#xff1f; 如果它们没有共享&#xff0c;则线程安全&#xff0c;即没有被外部访问。 如果它们被共享了&#xff0c;根据它们的状态是否能够改变&#xff0c;又分两种情况 如果只有读操作&#xff0c;则线程安全 如果有读写操作&#xff0c;…

【图形学】TA之路-矩阵应用平移-旋转-大小

矩阵应用&#xff1a;在 Unity 中&#xff0c;Transform 和矩阵之间的关系非常密切。Transform 组件主要用于描述和控制一个物体在三维空间中的位置、旋转和缩放&#xff0c;而这些操作背后实际上都是通过矩阵来实现的 1. Transform 组件与矩阵的关系 Transform 组件包含以下…

java简单实现双链表代码

package com.se.day03.aGenericity.eDataStructrue;/*** 自定义一个双链表的数据结构。**/public class MyDoubleList<E> {//新创建容器时&#xff0c;头部和尾部元素都是null,size0;private Node head; //头部元素private Node tail; //尾部元素private int size; // …

特殊数组Z(前缀和)

前言&#xff1a;想了好一会才想到是前缀和来写&#xff0c;并且我一开始的是从考虑这个数和这个数后面一个数&#xff0c;导致边界烦了我好久 看了一下&#xff0c;考虑这个数和这个数前一个数更好 class Solution { public:vector<bool> isArraySpecial(vector<int…

按键按下,LED 点亮,但是,理论和现象不符

通过 Debug &#xff0c;解决了一个 Bug&#xff0c;很开心&#x1f604;&#xff0c;记录下 想实现的效果&#xff1a;按下 PB12 上的按钮&#xff0c;PA7 上的 LED 点亮&#xff1b;松开&#xff0c;LED 熄灭 单片机型号&#xff1a;STM32F103C8T6 PB12 为上拉电阻&#xf…

高可用负载均衡集群

高可用负载均衡集群 相比单点的负载均衡集群&#xff0c;高可用负载均衡集群可以解决以下两个问题。 1. real server某个服务down会怎么样&#xff1f;如何解决&#xff1f; 解决 自动调用好的real server 2. scheduler server down会怎么样&#xff1f;如何解决&#xff1f…

Docker容器管理之FAQ

一、前言 某次&#xff0c;某容器服务发现无法使用了&#xff0c;查看状态为restaring状态&#xff0c;后看是云主机重启了&#xff0c;导致本地的nfs-server未自动启动&#xff0c;导致关联的集群主机&#xff0c;远程挂载点无法使用&#xff0c;影响容器服务运行。故此&#…

Qt编译错误: error: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set

方法一&#xff1a;清空构建目录 清空当前目录的多余文件即可&#xff0c;具体操作如下 一个正常的Qt项目刚被创建且没有编译时是这样的 一个main文件&#xff0c;一个pro文件&#xff0c;一个user文件&#xff0c;一个头文件(.h)&#xff0c;和一个源文件(.cpp)&#xff0c;一…

springsecurity的学习(四):实现授权

简介 springsecurity的授权&#xff0c;自定义授权失败的处理&#xff0c;跨域的处理和自定义权限校验方法的介绍 授权 权限系统作用 在后台进行用户权限的判断&#xff0c;判断当前用户是否有相应的权限&#xff0c;必须具有所需的权限才能进行相应的操作&#xff0c;以此…

高通分享:glTF 2.0扩展MPEG、3GPP在AR/VR 3D场景的沉浸式体验

日前&#xff0c;高通技术标准高级总监托马斯斯托克哈默尔&#xff08;Thomas Stockhammer&#xff09;和高通技术标准总监伊梅德布亚齐兹&#xff08;Imed Bouazizi&#xff09;撰文分享了ISO和Khronos之间是如何紧密合作&#xff0c;并最终开发出MPEG-I Scene Description IS…

基于LangChain的大模型学习手册(入门级)

前言 时间轴来到2024年的下半年&#xff0c;“大模型”这个术语&#xff0c;从几乎是ChatGPT的代名词&#xff0c;转变为AI领域一个划时代产品的广泛词汇。从单一到广泛&#xff0c;代表大模型这个世界级产品&#xff0c;正在走向枝繁叶茂的生命阶段。截止现在&#xff0c;目前…

【算法分析与设计】期末复习-小题100道

目录 0、基础知识点 一、单选题 二、多选题 三、判断题 0、基础知识点 &#xff08;1&#xff09;常见时间复杂度与公式&#xff1a; 汉诺塔&#xff1a;T(n)O(2^n) 全排列&#xff1a;T(n)O(n!) 整数划分&#xff1a; 正整数n的划分&#xff1a;p(n)q(n,n) 分治&#…

推荐系统三十六式学习笔记:工程篇.效果保证31|推荐系统的测试方法及常用指标介绍

目录 为什么要关注指标推荐系统的测试方法1.业务规则扫描2.离线模拟测试3.在线对比测试4.用户访谈 常用指标1.系统有多好&#xff1f; 假设你已经有了自己的推荐系统&#xff0c;这个系统已经上线。 为什么要关注指标 面对推荐系统这样一个有诸多复杂因素联动起作用的系统&am…

C++入门:类和对象(入门篇)

目录 前言 类的定义 1.类定义格式 2.从结构体到类的跨越 3.访问限定符 4.类域 5.类的实例化 类的默认成员函数 1.默认成员函数的定义和学习方向 2.构造函数 3.析构函数 4.拷贝构造函数 5.重载运算符 总结 疑难解答 1.this指针的用法 2.为什么拷贝构造函数的第一个参数必须…