Arduino串口读写问题:Node.js中SerialPort不是构造函数报错
Node.js中使用SerialPort报错:TypeError: SerialPort is not a constructor
问题描述
我想开发一个程序,读取Arduino通过USB串口发送的数据并显示,但运行Node.js代码时遇到以下错误:
const port = new SerialPort('COM6', { baudRate: 9600 }); ^ TypeError: SerialPort is not a constructor
Node.js代码
import Readline from '@serialport/parser-readline'; const port = new SerialPort('COM6', { baudRate: 9600 }); const parser = port.pipe(new Readline({ delimiter: '' })); // Read the port data port.on("open", () => { console.log('serial port open'); }); port.write("1", (err) => { if (err) { return console.log('Error on write: ', err.message); } console.log('message written'); }); parser.on('data', data =>{ console.log('State of light:', data); });
Arduino代码
void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { char command = Serial.read(); if (command == "1") { Serial.println("1"); } else if (command == '0') { Serial.println("0"); } } delay(5000); }
解决方案
1. 修复SerialPort的导入问题
报错的直接原因是未导入SerialPort类,按照ESM规范补充导入:
import { SerialPort } from 'serialport'; import Readline from '@serialport/parser-readline';
同时确保已安装所需依赖:
npm install serialport @serialport/parser-readline
2. 修正Arduino的字符比较逻辑
Arduino代码中command == "1"是错误的——command是char类型,必须用单引号匹配单个字符:
if (command == '1') { Serial.println("1"); } else if (command == '0') { Serial.println("0"); }
双引号用于字符串,单引号用于单个字符,类型不匹配会导致逻辑无法触发。
3. 优化Readline的分隔符设置
Arduino用Serial.println发送的数据会带\r\n换行符,当前空分隔符无法正确分割数据,建议修改为:
const parser = port.pipe(new Readline({ delimiter: '\r\n' }));
这样才能准确读取每一行完整的串口数据。
内容的提问来源于stack exchange,提问作者TheCreativeMaker
相关产品推荐
相关产品推荐

