获取USB串口电子秤数据

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.总结

  • 订阅后能够持续接收设备发送的数据
  • 打开设备后需要关闭才能再次打开
  • 完成流程是,先获取设备清单,根据获取到的设备清单中的数据,打开设备并订阅,成功后会持续接收设备发送数据,点击接收消息只会展示一条数据。完成数据处理后关闭设备,以便后续打开设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值