1.引用插件usb-serial
2.完整代码
<template>
<view class="container">
<view class="area">
<view class="label">基本操作</view>
<view class="btn-group">
<button class="btn-item" @click="handleDevice" size="mini">获取设备</button>
<button class="btn-item" @click="handleConnect" size="mini">打开设备</button>
<button class="btn-item" @click="handleRead" size="mini">读取数据</button>
<button class="btn-item" @click="handleDisconnect" size="mini">关闭设备</button>
</view>
</view>
<view class="cell">
<view class="area">
<view class="label">设备订阅</view>
<view class="btn-group">
<button class="btn-item" @click="handleSubscribeUsb" size="mini">订阅</button>
<button class="btn-item" @click="handleUnsubscribeUsb" size="mini">取消订阅</button>
</view>
</view>
<view class="area">
<view class="label">消息订阅</view>
<view class="btn-group">
<button class="btn-item" @click="handleSubscribeMsg" size="mini">订阅</button>
<button class="btn-item" @click="handleUnsubscribeMsg" size="mini">取消订阅</button>
</view>
</view>
</view>
<view class="table">
<view class="th">
<text class="td">设备名称</text>
<text class="td">设备ID</text>
<text class="td">vendorId(VID)</text>
<text class="td">产品名称</text>
<text class="td">productId(PID)</text>
</view>
<view>
<view class="tr" v-for="(item,i) in list" :key="i" @click="handleConnect(item.vendorId,item.productId)">
<text class="td">{{item.deviceName}}</text>
<text class="td">{{item.deviceId}}</text>
<text class="td">{{item.vendorId}}</text>
<text class="td">{{item.productName}}</text>
<text class="td">{{item.productId}}</text>
</view>
</view>
</view>
<view class="result">
<view class="result-btn">
<view class="title">输出:</view>
<button class="btn-item" @click="handleClear" size="mini">清除</button>
</view>
<textarea class="output" v-model="output" disabled></textarea>
</view>
</view>
</template>
<script>
// 引入插件
import {
UsbSerial
} from '@/uni_modules/shmily-usb-serial';
let usbSerial;
export default {
data() {
return {
list: [],
output: '',
isCollecting: false, // 是否正在收集数据
newData: '', // 当前收集的数据
newDataList: [] // 存储完整的数据组
};
},
mounted() {
// 实例化
usbSerial = new UsbSerial();
this.handleDevice();
},
methods: {
// 订阅消息,收到数据自动执行回调
handleSubscribeMsg() {
var that = this
const {
success,
message
} = usbSerial.subscribe({
dataType: 'ASCII',
bufferSize: 256
}, (data) => {
if (that.newDataList.length < 5) {
if (data.trim() == 'w' && that.newData.length <= 12) {
that.isCollecting = true
}
if (that.newData.length == 12) {
that.isCollecting = false
}
if (that.isCollecting) {
that.newData += data.trim()
} else {
if (that.newData.length == 12) {
that.newDataList.push(that.newData)
that.newData = ''
}
}
} else {
if (that.newDataList[0] == that.newDataList[1] && that.newDataList[0] == that.newDataList[
2] && that.newDataList[0] == that.newDataList[3] && that.newDataList[0] == that
.newDataList[4]) {
console.log('重量为:' + that.newDataList[0])
that.handleDisconnect()
} else {
console.log(that.newDataList)
}
}
});
if (success) {
this.updateOutput('消息订阅成功');
} else {
this.updateOutput(message);
}
},
// 取消消息订阅
handleUnsubscribeMsg() {
usbSerial.unsubscribe();
this.updateOutput('取消消息订阅成功');
},
// 订阅设备,设备连接自动执行回调
handleSubscribeUsb() {
usbSerial.registerUsbAttach((action) => {
this.updateOutput(action ? '设备插入' : '设备移除');
this.handleDevice();
});
this.updateOutput('设备订阅成功');
},
// 取消设备订阅
handleUnsubscribeUsb() {
usbSerial.unregisterUsbAttach();
this.updateOutput('取消设备订阅成功');
},
// 查询设备
handleDevice() {
this.list = usbSerial.getDeviceList();
this.updateOutput('设备获取成功');
},
// 打开设备
handleConnect(vendorId,productId) {
console.log(data)
const success = usbSerial.connect({
vendorId: vendorId, // 请填写实际值
productId: productId, // 请填写实际值
baudRate: 9600, // 请填写实际值
dataBits: 8, // 请填写实际值
stopBits: 1, // 请填写实际值
parity: 0, // 请填写实际值
}, ({
success,
message
}) => {
this.updateOutput(message);
if (success) {
this.handleSubscribeMsg();
}
});
},
// 读取数据
handleRead() {
const {
data,
success,
message
} = usbSerial.read('ASCII');
if (success) {
this.updateOutput(`读取数据:${data}`);
} else {
this.updateOutput(message);
}
},
// 关闭连接
handleDisconnect() {
usbSerial.disconnect(({
success,
message
}) => {
this.updateOutput(message);
});
},
handleClear() {
this.output = '';
},
updateOutput(msg) {
this.output += `${msg}\n`;
}
}
}
</script>
<style lang="scss" scoped>
.container {
padding: 20rpx;
font-size: 14px;
}
.cell {
display: flex;
justify-content: space-between;
column-gap: 15rpx;
.area {
flex: 1;
}
}
.area {
padding: 10rpx 10rpx 20rpx;
border: 1px dashed #cccccc;
margin-bottom: 20rpx;
&+& {
margin-left: 15rpx;
}
.label {
width: fit-content;
margin-top: -30rpx;
background-color: white;
}
}
.btn-group {
width: fit-content;
display: flex;
margin-top: 15rpx;
}
.btn-item {
width: fit-content;
font-size: 12px;
&+& {
margin-left: 15rpx;
}
}
.table {
min-height: 200rpx;
border: 1px solid #cccccc;
.th {
border-bottom: 1px solid #cccccc;
}
.tr+.tr {
border-top: 1px dashed #cccccc;
}
.th,
.tr {
display: flex;
align-items: center;
font-size: 12px;
.td {
flex: 1;
text-align: center;
max-width: 25%;
word-break: break-all;
padding: 8px 4px;
}
}
}
.result {
margin-top: 20rpx;
.result-btn {
display: flex;
align-items: center;
justify-content: space-between;
.btn-item {
margin: initial;
}
}
.output {
font-size: 13px;
line-height: 1.5;
margin-top: 20rpx;
height: 500rpx;
width: 100%;
background-color: #333333;
color: white;
padding: 20rpx;
border-radius: 8rpx;
box-sizing: border-box;
}
}
</style>
3.配置USB串口数据
- 根据真实情况填写数据,其实主要填写vendorId,productId,其他参数大致相同,根据需要改动。
handleConnect(vendorId,productId) {
console.log(data)
const success = usbSerial.connect({
vendorId: vendorId, // 供应商id
productId: productId, // 产品id
baudRate: 9600, //波特率
dataBits: 8, // 数据位
stopBits: 1, // 停止位
parity: 0, // 校验位
}, ({
success,
message
}) => {
this.updateOutput(message);
if (success) {
this.handleSubscribeMsg();
}
});
},
4.根据我这的需求,需要对数据进行转化
handleSubscribeMsg() {
var that = this
const {
success,
message
} = usbSerial.subscribe({
dataType: 'ASCII',
bufferSize: 256
}, (data) => {
if (that.newDataList.length < 5) {
if (data.trim() == 'w' && that.newData.length <= 12) {
that.isCollecting = true
}
if (that.newData.length == 12) {
that.isCollecting = false
}
if (that.isCollecting) {
that.newData += data.trim()
} else {
if (that.newData.length == 12) {
that.newDataList.push(that.newData)
that.newData = ''
}
}
} else {
if (that.newDataList[0] == that.newDataList[1] && that.newDataList[0] == that.newDataList[2] &&
that.newDataList[0] == that.newDataList[3] &&
that.newDataList[0] ==that.newDataList[4]) {
console.log('重量为:' + that.newDataList[0])
that.handleDisconnect()
} else {
console.log(that.newDataList)
}
}
});
if (success) {
this.updateOutput('消息订阅成功');
} else {
this.updateOutput(message);
}
},
- 我要根据获取到电子秤的数据组合成数据,并判断是否一致来检验数据的稳定性
- 由于电子秤传输的数据为 一位一位传输,所以我需要将数据整合
5.总结
- 订阅后能够持续接收设备发送的数据
- 打开设备后需要关闭才能再次打开
- 完成流程是,先获取设备清单,根据获取到的设备清单中的数据,打开设备并订阅,成功后会持续接收设备发送数据,点击接收消息只会展示一条数据。完成数据处理后关闭设备,以便后续打开设备。