You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:54:04