Files
shgx_tz_vue-sync/src/views/qualityManagement/gp12/touchScreen/tool/comText.vue

129 lines
3.8 KiB
Vue
Raw Normal View History

2025-01-02 17:54:39 +08:00
<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>