129 lines
3.8 KiB
Vue
129 lines
3.8 KiB
Vue
|
|
<template>
|
|||
|
|
<div>
|
|||
|
|
<button @click="connectSerial" :disabled="serialPort !== null">
|
|||
|
|
连接串口
|
|||
|
|
</button>
|
|||
|
|
<button @click="disconnectSerial" :disabled="serialPort === null">
|
|||
|
|
断开串口
|
|||
|
|
</button>
|
|||
|
|
<p v-if="serialPort !== null">已连接到: {{ serialPort.getInfo().usbVendorId }}:{{ serialPort.getInfo().usbProductId
|
|||
|
|
}}</p>
|
|||
|
|
<p v-else>未连接</p>
|
|||
|
|
<p v-if="errorMessage">{{ errorMessage }}</p>
|
|||
|
|
<pre>{{ receivedData }}</pre>
|
|||
|
|
<pre>{{ code }}</pre>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import SCAN from "./scanCode" // from后面为创建的SCAN类文件地址
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
serialPort: null,
|
|||
|
|
reader: null,
|
|||
|
|
writer: null,
|
|||
|
|
errorMessage: '',
|
|||
|
|
receivedData: '',
|
|||
|
|
code: ''
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
async created() {
|
|||
|
|
this.scan = new SCAN(this, 200)
|
|||
|
|
// 重新注册scanCode事件,
|
|||
|
|
// this.$bus.$on('scanCode', this.handleCode)
|
|||
|
|
this.scan.start() //开启监听
|
|||
|
|
},
|
|||
|
|
beforeDestroy() {
|
|||
|
|
// this.$bus.$off('scanCode')
|
|||
|
|
this.scan.stop()
|
|||
|
|
},
|
|||
|
|
activated() {
|
|||
|
|
// 注销scanCode事件
|
|||
|
|
// this.$bus.$off('scanCode')
|
|||
|
|
// this.$bus.$on('scanCode', this.handleCode)
|
|||
|
|
this.scan.start()
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
async connectSerial() {
|
|||
|
|
try {
|
|||
|
|
this.serialPort = await navigator.serial.requestPort();
|
|||
|
|
console.log('选择了串口:', this.serialPort);
|
|||
|
|
|
|||
|
|
// 检查浏览器是否支持所需的波特率
|
|||
|
|
const options = { baudRate: 9600 };
|
|||
|
|
await this.serialPort.open(options);
|
|||
|
|
console.log('串口已打开');
|
|||
|
|
|
|||
|
|
// 设置读取器
|
|||
|
|
this.reader = this.serialPort.readable.getReader();
|
|||
|
|
this.readLoop();
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('无法打开串口:', error);
|
|||
|
|
this.errorMessage = `无法打开串口: ${error.message}`;
|
|||
|
|
this.serialPort = null
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
async readLoop() {
|
|||
|
|
while (true) {
|
|||
|
|
try {
|
|||
|
|
const { value, done } = await this.reader.read();
|
|||
|
|
if (done) {
|
|||
|
|
console.log('读取完成');
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
// 将接收到的字节数组转换为字符串
|
|||
|
|
const decoder = new TextDecoder();
|
|||
|
|
const decodedValue = decoder.decode(value, { stream: true });
|
|||
|
|
this.receivedData += decodedValue;
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('读取数据时出错:', error);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 关闭读取器
|
|||
|
|
this.reader.releaseLock();
|
|||
|
|
this.reader = null;
|
|||
|
|
},
|
|||
|
|
disconnectSerial() {
|
|||
|
|
if (this.reader) {
|
|||
|
|
this.reader.cancel();
|
|||
|
|
this.reader.releaseLock();
|
|||
|
|
this.reader = null;
|
|||
|
|
}
|
|||
|
|
if (this.writer) {
|
|||
|
|
this.writer.close();
|
|||
|
|
this.writer = null;
|
|||
|
|
}
|
|||
|
|
if (this.serialPort) {
|
|||
|
|
this.serialPort.close();
|
|||
|
|
this.serialPort = null;
|
|||
|
|
console.log('串口已关闭');
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
handleCode(code) {
|
|||
|
|
code = code.trim()
|
|||
|
|
if (!code) return
|
|||
|
|
this.code = code
|
|||
|
|
this.handleSearchCode()
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped>
|
|||
|
|
button {
|
|||
|
|
margin: 5px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pre {
|
|||
|
|
background-color: #f4f4f4;
|
|||
|
|
padding: 10px;
|
|||
|
|
border-radius: 5px;
|
|||
|
|
overflow-y: auto;
|
|||
|
|
max-height: 200px;
|
|||
|
|
}
|
|||
|
|
</style>
|