Node.js与Arduino通过SerialPort通信的发送数据异常问题
Node.js SerialPort无法向Arduino发送数据的排查与解决
问题描述
搭建Node.js服务器与Arduino实现双向通信:Node.js向Arduino发送字符'1',Arduino接收后回传该数据。目前可接收Arduino数据,但无法成功发送数据,使用SerialPort库。
原代码
Arduino代码
char incomingByte; void setup() { Serial.begin(9600); } void loop() { incomingByte = Serial.read(); if (incomingByte == 49) { Serial.write(incomingByte); } }
Node.js代码
const { SerialPort } = require('serialport'); const port = new SerialPort('/dev/cu.usbmodem14201', { baudRate: 9600, dataBits: 8, stopBits: 1, parity: 'none' }); port.on('open', () => { port.write('1'); }); port.on('data', (data) => { console.log(data.toString()); }); port.on('error', (err) => { console.error('Error:', err); });
问题原因及解决方案
1. Arduino初始化与数据读取逻辑问题
Arduino上电或重新连接串口后,需要几秒完成初始化,此时Node.js立即发送数据会丢失。同时原代码未检查串口是否有可用数据,Serial.read()在无数据时返回-1,可能导致逻辑异常。
修改后的Arduino代码:
char incomingByte; void setup() { Serial.begin(9600); // 等待USB串口连接完成(适配部分Arduino板型) while (!Serial) { ; // 阻塞直到串口准备就绪 } } void loop() { // 先确认有可读取的数据再执行读取操作 if (Serial.available() > 0) { incomingByte = Serial.read(); if (incomingByte == 49) { // 匹配ASCII码49(对应字符'1') Serial.write(incomingByte); } } }
2. Node.js发送时机与写入确认问题
原代码串口打开后立即发送数据,未等待Arduino完成初始化;且未处理port.write()的写入回调,无法确认数据是否发送成功。
修改后的Node.js代码:
const { SerialPort } = require('serialport'); const port = new SerialPort('/dev/cu.usbmodem14201', { baudRate: 9600, dataBits: 8, stopBits: 1, parity: 'none', autoOpen: false // 手动控制串口打开时机,方便调整发送节奏 }); // 手动打开串口并延迟发送 port.open((err) => { if (err) { return console.error('串口打开失败:', err); } console.log('串口已连接'); // 延迟1秒发送,给Arduino足够的初始化时间 setTimeout(() => { port.write('1', (err) => { if (err) { return console.error('数据写入失败:', err); } console.log('已发送字符"1"'); }); }, 1000); }); port.on('data', (data) => { console.log('收到回传数据:', data.toString()); }); port.on('error', (err) => { console.error('串口错误:', err); });
3. 其他排查点
- 确认串口路径正确:通过Arduino IDE的「工具->端口」查看当前连接的串口,替换代码中的路径。
- 关闭Arduino IDE串口监视器:该工具会占用串口,导致Node.js无法正常通信。
- 检查串口权限(Linux/macOS):将当前用户加入
dialout(Linux)或uucp(macOS)组,避免权限不足导致的写入失败。
内容的提问来源于stack exchange,提问作者Gabriel Sadigursky
相关产品推荐
相关产品推荐

