Node.js向串口发数据报错求助,求可用的简单实现代码
Node.js 串口发送数据到 Arduino 解决方案
错误原因分析
你遇到的 "path is not defined" 错误是因为新版 SerialPort(v10+)的构造函数参数格式变更——不再支持单独传入端口路径作为第一个参数,必须将路径包含在配置对象中。之前的 "serialport is not a constructor" 则大概率是导入方式不匹配版本导致的。
修正后的完整代码
const express = require('express'); const { SerialPort } = require('serialport'); const app = express(); const serverPort = 3000; app.use(express.json()); // 串口配置:新版 SerialPort 需将路径放入配置对象 const serialConfig = { path: 'COM3', // 替换为你的实际串口(Windows 是 COMx,Mac/Linux 是 /dev/tty.usbmodemxxx 之类) baudRate: 115200, autoOpen: false // 手动控制打开时机,方便处理错误 }; const serialPort = new SerialPort(serialConfig); // 监听串口连接成功事件 serialPort.open((err) => { if (err) { return console.error('串口打开失败:', err.message); } console.log('已连接到串口:', serialConfig.path); }); // 监听串口错误事件 serialPort.on('error', (err) => { console.error('串口错误:', err.message); }); app.post('/send', (req, res) => { const { message } = req.body; if (!message) { return res.status(400).send('请提供要发送的 message 参数'); } // 写入串口数据,处理写入错误(加换行符方便 Arduino 读取,可根据实际代码调整) serialPort.write(message + '\n', (err) => { if (err) { console.error('数据发送失败:', err.message); return res.status(500).send('数据发送失败'); } console.log('已发送数据:', message); res.send('数据已发送到串口'); }); }); app.listen(serverPort, () => { console.log(`服务器运行在 http://localhost:${serverPort}`); });
关键改动说明
- 构造函数参数调整:将端口路径移入配置对象的
path属性,符合新版 SerialPort 的要求。 - 添加错误处理:增加
open回调和error事件监听,便于排查连接失败问题。 - 写入数据优化:添加写入回调处理发送失败的情况,可选添加换行符适配 Arduino 的字符串读取逻辑。
- 参数校验:在接口中校验
message参数是否存在,避免空数据发送。
额外注意事项
- 串口权限:Windows 可能需要管理员权限运行终端;Mac/Linux 需要将用户加入
dialout或uucp组(执行命令:sudo usermod -aG dialout $USER)。 - Arduino 代码配合:确保 Arduino 端波特率与 Node.js 代码一致,示例 Arduino 代码:
void setup() { Serial.begin(115200); } void loop() { if (Serial.available() > 0) { String input = Serial.readStringUntil('\n'); Serial.println("收到指令: " + input); // 在这里根据 input 执行对应操作 } delay(100); } - 端口正确性:确认 Arduino 连接的串口编号,Windows 可在设备管理器查看,Mac/Linux 用
ls /dev/tty.*查看。
内容的提问来源于stack exchange,提问作者Saba Shayulashvili
相关产品推荐
相关产品推荐

