Google Chrome Web Serial API如何通过十六进制码寻址Modbus设备
基于Web Serial API发送Modbus十六进制寻址指令的实现方法
Web Serial API的write方法原生支持Uint8Array类型的二进制数据输入,你只需要将已验证通过的十六进制指令转换为Uint8Array格式即可直接发送,无需转成文本格式。
1. 十六进制指令转Uint8Array工具方法
首先实现转换方法,将空格分隔的十六进制字符串转为串口可识别的二进制数组:
/** * 空格分隔的十六进制串转Uint8Array * @param {string} hexStr 如 "01 03 00 01 00 02 95 CB" * @returns {Uint8Array} 可直接传入串口write方法的二进制数组 */ function hexToUint8Array(hexStr) { const hexList = hexStr.trim().split(/\s+/).filter(Boolean); return new Uint8Array(hexList.map(hex => parseInt(hex, 16))); } // 转换你已验证的寻址指令 const modbusAddressingCmd = hexToUint8Array('01 03 00 01 00 02 95 CB');
2. 串口发送指令实现
在你完成串口设备选择、端口配置(需和Modbus设备参数一致,常用配置为波特率9600、8数据位、1停止位、无校验)后,调用以下方法发送指令即可:
// port为你调用navigator.serial.requestPort()获取、且已执行port.open()完成配置的串口对象 async function sendCmd(port, cmdArray) { const writer = port.writable.getWriter(); try { await writer.write(cmdArray); } finally { // 写完必须释放锁,避免后续读写阻塞 writer.releaseLock(); } } // 调用发送寻址指令 sendCmd(port, modbusAddressingCmd);
3. 可选:接收设备响应并转十六进制查看
如果需要读取设备返回的结果,可通过以下方法将收到的二进制数据转回十六进制串方便调试:
/** * Uint8Array转空格分隔的十六进制串 * @param {Uint8Array} uint8Arr 串口读取到的二进制数据 * @returns {string} 可读的十六进制字符串 */ function uint8ToHex(uint8Arr) { return Array.from(uint8Arr) .map(byte => byte.toString(16).padStart(2, '0')) .join(' '); } // 读取响应示例 async function readResponse(port) { const reader = port.readable.getReader(); try { const { value, done } = await reader.read(); if (!done) { console.log('设备响应十六进制:', uint8ToHex(value)); // 此处补充响应解析逻辑 } } finally { reader.releaseLock(); } }
注意事项
- 串口配置参数必须和目标Modbus设备完全匹配,否则会出现无响应、响应乱码的问题
- 若后续需要自定义其他Modbus指令,需确保CRC校验值计算正确,否则设备不会响应
内容的提问来源于stack exchange,提问作者5-HT2A
相关产品推荐
相关产品推荐

