Node.js fs.writeFile写入sysfs无法触发DS18B20批量温度转换
DS18B20批量转换:Node.js writeFile失效的原因与解决办法
原因分析
- 换行符缺失:手动执行
echo trigger > ...时,echo会自动在输出末尾添加换行符(\n),而Node.js的writeFile默认只写入纯字符串trigger,不带换行。w1_therm内核模块的therm_bulk_read节点需要换行符来识别完整的触发命令,无换行的内容会被内核忽略。 - 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
相关产品推荐
相关产品推荐

