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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:32