Web Serial Port串口秤通信实现及代码读写问题排查咨询
串口电子秤通信排查与修复方案
先给你捋代码里的核心问题,以及对应的修复方式:
核心问题点
- 读取流未关联串口:你的
readLoop里只创建了TextDecoderStream,但没把串口的可读流(port.readable)管道到解码器的可写流,等于根本没从串口读取数据。 - 指令格式错误:你写入的
"W<CR>"里的<CR>是字符串文本,电子秤需要的是ASCII回车控制字符,应该用\r代替。 - 缺少错误排查机制:没有针对写入、读取环节加错误捕获,没法定位到底是写不进去还是读不到数据。
修复后的完整代码
let port; let writer; async function initSerial() { try { // 请求串口设备 port = await navigator.serial.requestPort(); // 打开串口,参数要和电子秤手册完全匹配 await port.open({ baudRate: 9600, dataBits: 8, parity: "none", stopBits: 1 // 多数电子秤默认1位停止位,建议补充 }); // 初始化读取流:关联串口可读流与解码器 const textDecoder = new TextDecoderStream(); await port.readable.pipeTo(textDecoder.writable); const reader = textDecoder.readable.getReader(); // 启动读取循环 readLoop(reader); // 初始化写入流 const textEncoder = new TextEncoderStream(); await textEncoder.readable.pipeTo(port.writable); writer = textEncoder.writable.getWriter(); // 发送正确指令:用\r代替<CR> await sendCommand("W\r"); console.log("指令已发送"); } catch (error) { console.error("初始化串口失败:", error); } } async function readLoop(reader) { try { while (true) { const { value, done } = await reader.read(); if (done) { console.log("读取流已关闭"); reader.releaseLock(); break; } console.log("收到电子秤数据:", value); } } catch (error) { console.error("读取数据失败:", error); } } async function sendCommand(cmd) { if (!writer) { console.error("写入流未初始化"); return; } try { await writer.write(cmd); } catch (error) { console.error("发送指令失败:", error); } } // 调用初始化函数 initSerial();
排查步骤(区分读/写问题)
- 验证写入有效性:
- 用串口调试助手连接电子秤,发送
W\r指令,看是否有返回数据。如果有,说明指令格式正确,再检查代码写入逻辑的错误日志。
- 用串口调试助手连接电子秤,发送
- 验证读取有效性:
- 用串口助手主动向电脑发送测试数据,看代码的
readLoop是否能打印出收到的内容。如果能,说明读取逻辑没问题,问题可能在电子秤未响应指令。
- 用串口助手主动向电脑发送测试数据,看代码的
- 核对串口参数:
- 必须和电子秤手册上的波特率、数据位、停止位、校验位完全一致,参数不匹配会直接导致通信失败。
内容的提问来源于stack exchange,提问作者Kenshai
相关产品推荐
相关产品推荐

