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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:15:40