如何使用Javascript读取COM串口数据并集成到Business Central 17 OnPrem插件
可行实现方案
方案1:浏览器原生Web Serial API(优先推荐,无需额外客户端部署)
- 适用条件:客户端使用Chromium内核浏览器(Chrome 89+/Edge 89+),Business Central 17 OnPrem站点部署为HTTPS(localhost本地调试可豁免HTTPS要求)。
- 核心实现逻辑:直接调用浏览器内置的
navigator.serial接口完成串口授权、连接、数据读取,无需依赖第三方工具。
示例代码:
// 绑定到页面按钮的点击事件触发,不可静默调用 async function connectSerialAndRead() { try { // 弹出系统串口选择框,用户手动选择目标COM口 const port = await navigator.serial.requestPort(); // 串口参数需和对接硬件参数完全匹配,此处波特率示例为9600 await port.open({ baudRate: 9600, dataBits: 8, stopBits: 1, parity: 'none' }); const reader = port.readable.getReader(); while (true) { const { value, done } = await reader.read(); if (done) { reader.releaseLock(); break; } // 按硬件协议解析二进制数据为整数,示例为小端序32位有符号整数,按需调整 const resultInt = new DataView(value.buffer).getInt32(0, true); // 此处触发BC Control Add-in的事件,把数值传递给BC AL层逻辑 Microsoft.Dynamics.NAV.InvokeExtensibilityMethod('OnSerialDataReceived', [resultInt]); } } catch (err) { console.error('串口操作失败:', err); } }
- 集成到BC 17的方式:将上述逻辑封装为BC Control Add-in(控件插件),在AL代码中声明Add-in的事件接收方法,直接把插件挂载到需要读取串口的BC页面上即可。
方案2:本地串口代理服务(兼容不支持Web Serial API的场景)
如果BC站点无法升级为HTTPS,或者客户端需要使用非Chromium内核浏览器,选择该方案:
- 客户端侧部署轻量Node.js代理服务,使用
serialport库读取串口数据,同时启动本地WebSocket服务,将读取到的整数实时推送给前端。 - Web组件内编写WebSocket连接逻辑,连接本地
ws://127.0.0.1:自定义端口接收数据,再传递给BC层。 - 集成方式和方案1一致,将WebSocket逻辑封装到BC Control Add-in即可,缺点是需要给所有对接硬件的客户端提前安装代理服务并配置开机自启。
关键注意事项
- Web Serial API必须由用户主动交互触发(比如点击按钮),无法静默调用获取串口权限,页面需增加明确的“连接硬件”操作入口。
- 串口参数(波特率、校验位、数据位等)必须和硬件设备的配置完全一致,否则会出现读取乱码、数据解析错误的问题。
- 数据解析逻辑需严格匹配硬件的通信协议,若硬件返回的是ASCII格式的数字字符串,需先把Uint8Array转为字符串再用
parseInt()转换,不要直接用二进制读取逻辑。
内容的提问来源于stack exchange,提问作者Fenther
相关产品推荐
相关产品推荐

