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

Node.js fs.writeFile写入sysfs无法触发DS18B20批量温度转换

DS18B20批量转换:Node.js writeFile失效的原因与解决办法

原因分析

  1. 换行符缺失:手动执行echo trigger > ...时,echo会自动在输出末尾添加换行符(\n),而Node.js的writeFile默认只写入纯字符串trigger,不带换行。w1_therm内核模块的therm_bulk_read节点需要换行符来识别完整的触发命令,无换行的内容会被内核忽略。
  2. sysfs节点的写入特性:sysfs文件节点本质是内核接口,和普通文件不同,对写入的格式、完整性要求更严格。Node.js的writeFile异步缓冲策略可能导致内容分块写入,内核无法正确识别命令;而echo通过shell一次性输出完整的带换行内容,完全符合内核的预期。

解决方案

方案1:写入带换行符的内容

在调用writeFile时给字符串加上换行符,确保内核能识别完整命令:

import { writeFile } from 'fs/promises';

await writeFile('/sys/bus/w1/devices/w1_bus_master1/therm_bulk_read', 'trigger\n', { flag: 'w' });

方案2:使用同步写入API

改用fs.writeSync绕开异步缓冲,直接同步写入完整内容:

import { openSync, writeSync, closeSync } from 'fs';

const fd = openSync('/sys/bus/w1/devices/w1_bus_master1/therm_bulk_read', 'w');
writeSync(fd, 'trigger\n');
closeSync(fd);

方案3:验证写入完整性

写入后读取节点内容,确认是否成功写入带换行的trigger,排查是否存在写入截断:

import { writeFile, readFile } from 'fs/promises';

await writeFile('/sys/bus/w1/devices/w1_bus_master1/therm_bulk_read', 'trigger\n', { flag: 'w' });
const content = await readFile('/sys/bus/w1/devices/w1_bus_master1/therm_bulk_read', 'utf8');
console.log('写入后的内容:', content); // 应输出'trigger\n'

验证效果

执行上述方案后,观察写入操作耗时应接近750ms,后续读取温度文件的速度会明显加快,说明批量转换已正常触发。

内容的提问来源于stack exchange,提问作者Nathanael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:52:40