Node.js串口读取地磅数据:小数格式异常的修正方法咨询
解决Node.js串口读取地磅数据时小数格式异常问题
问题描述
通过Node.js的SerialPort读取地磅数据时,无小数的重量读取正常,但读取带小数的数值(如138.40)时,得到的字符串末尾会多出一个点,示例如下:
byteData>>> <Buffer 2b 2d 31 33 38 34 30 2e>
byteData.toString()>>> +-13840.
问题分析
从原始Buffer可以看出,地磅输出格式是将小数位放在数字末尾(如138.40被输出为13840),但额外多了一个结尾的点。同时你的代码存在一处问题:在readable事件中两次调用port.read(),会导致数据被拆分读取,可能引发数据不完整或重复读取的情况。
解决方案
1. 修正串口读取逻辑
先确保只读取一次串口数据,避免数据丢失或拆分:
port.on('readable', function () { // 仅读取一次数据并存储 const rawData = port.read(); if (!rawData) return; // 无数据时直接返回 const truckWeightStr = rawData.toString().trim(); // 去除可能的空白字符 console.log('原始数据:', truckWeightStr); // 后续添加数据格式转换逻辑 });
2. 转换异常的小数格式
针对末尾带点的字符串,按以下步骤处理:
- 去除字符串末尾的点(如果存在)
- 将数字部分的最后两位作为小数位,前面的作为整数位
- 组合为正确的小数格式并转换为数值
完整处理代码:
const { SerialPort } = require('serialport'); const apiServer = require('./api'); const logger = require('./log_config'); const port = new SerialPort({ path: '/dev/ttyS0', baudRate: 2400 }, function (err) { if (err) { logger.error(err.message); logger.error('Test Error'); return console.log('Error: ', err.message) } }) port.on('readable', function () { const rawData = port.read(); if (!rawData) return; let truckWeightStr = rawData.toString().trim(); console.log('原始读取数据:', truckWeightStr); // 移除末尾多余的点 if (truckWeightStr.endsWith('.')) { truckWeightStr = truckWeightStr.slice(0, -1); } // 处理符号、整数位和小数位(假设地磅固定保留两位小数) const sign = truckWeightStr.startsWith('+-') ? '-' : ''; // 根据实际协议调整符号规则 const numPart = truckWeightStr.replace('+-', ''); // 剥离符号部分 let correctNumStr; if (numPart.length > 2) { // 带小数的情况:最后两位作为小数位 correctNumStr = `${sign}${numPart.slice(0, -2)}.${numPart.slice(-2)}`; } else { // 无小数的情况 correctNumStr = `${sign}${numPart}`; } // 转换为数值类型 const truckWeight = parseFloat(correctNumStr); console.log('转换后数值:', truckWeight); }) port.write('main screen turn on', function(err) { if (err) { return console.log('Error on write: ', err.message) } console.log('message written') })
补充说明
- 符号处理:示例数据中
+-代表负号,你可以根据地磅实际通信协议调整符号判断逻辑。 - 小数位长度:如果地磅小数位不是固定两位,需对应调整拆分规则。
- 数据完整性:若串口存在分包情况,需添加数据缓存逻辑,等待完整数据包(比如根据换行符或特定结束符判断)后再处理。
内容的提问来源于stack exchange,提问作者Hkachhia
相关产品推荐
相关产品推荐

