上位机使用JS SerialPort进行串口通信, 包含开发环境搭建和完整示例代码

在嵌入式开发中,我们经常需要使用上位机(PC)与一些电路模块进行通信, 用于获取一些传感器的数据,或者发送命令控制相应的电路模块。NodeJS目前支持使用SerialPort模块进行串口通信,本文主要介绍如何搭建测试开发环境和如何使用SerialPort进行串口通信。

开发前准备:

1. 下载安装NodeJS

2. 下载安装虚拟串口工具: Virtual Serial Port Driver (可自行搜索下载, 用于模拟虚拟串口使用,如果你的机子上已经有物理的串口模块,则不需要此软件)

3. 下载安装串口调试工具: 友善串口调试助手 (可自行搜索下载)

使用虚拟串口工具Virtual Serial Port Driver 虚拟出串口用于开发调试(如果已经有物理串口模块,则不需要创建虚拟串口)

1. 打开软件,选择Pair, 用于创建一个串口对:

2. 点击Create正式创建出串口对:

3. 创建完成后如下图所示,系统已经虚拟出了两个串口COM1和COM2, 这两个串口为一个串口对,往COM1或者COM2发送数据,则另一个串口将会收到相应的数据:

开发流程:

1. 首先新建一个开发目录,例如serial-port目录,在开发目录中,安装SerialPort模块

npm install serialport@10.3.0

2. 安装完成后,新建一个index.js文件,在代码中引入SerialPort模块

const { SerialPort } = require('serialport');

3. 获得串口列表代码:

const ports = await SerialPort.list();
console.log(ports.map(port => port.path + ":" + port.friendlyName).join("\n"));

上面的代码可以打印出类似如下的串口信息

COM1:Electronic Team Virtual Serial Port (COM1->COM2)
COM2:Electronic Team Virtual Serial Port (COM2->COM1)

4. 打开COM1串口,并添加监听事件,用于接收串口发到上位机的数据

const port = new SerialPort({ path: "COM1", baudRate: 9600, autoOpen: false });

port.on('error', err => {
  console.log('发生错误: ' + err.message + "\n");
});

port.on('data', data => {
  console.log('收到数据: ' + data + "\n");
});

port.open(function (err) {
  if (err) {
    console.log('端口打开失败: ' + err.message + "\n");return;
  }
  console.log('打开端口成功' + "\n");
});   

5. 向COM1串口发送数据

try {
  port.write("你好"+ "\n");
}
catch (err) {
  console.log('发送数据失败: ' + err.message+'\n');
}

6.完整的示例代码如下所示:

const { SerialPort } = require('serialport');
async function testSerialPort() {
  const ports = await SerialPort.list();
  console.log(ports.map(port => port.path + ":" + port.friendlyName).join("\n"));
    const port = new SerialPort({ path: "COM1", baudRate: 9600, autoOpen: false });

    port.on('error', err => {
      console.log('发生错误: ' + err.message + "\n");
    });

    port.on('data', data => {
      console.log('收到数据: ' + data + "\n");
    });

    port.open(function (err) {
      if (err) {
        console.log('端口打开失败: ' + err.message + "\n");
        return;
      }
      console.log('打开端口成功' + "\n");

    try {
      port.write("你好"+ "\n");
    }
    catch (err) {
      console.log('发送数据失败: ' + err.message+'\n');
    }
  });
}
testSerialPort();

测试流程:

1. 打开串口调试工具,并连接COM2串口,如下图所示:

 2.打开成功后,如下图所示 

3.运行刚才开发的代码,可以在串口调试助手里看到发送的消息

4. 同理,在调试助手里发送数据,则可以在运行的代码中接收到相应的数据。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个基于Qt的上位机和下位机422串口通信的整示例代码: ```c++ // main.cpp #include <QCoreApplication> #include <QDebug> #include <QSerialPort> #include <QSerialPortInfo> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 查找可用的串口 QList<QSerialPortInfo> serialPortInfos = QSerialPortInfo::availablePorts(); if (serialPortInfos.isEmpty()) { qWarning() << "No serial ports found!"; return 1; } // 输出可用的串口信息 qDebug() << "Available serial ports:"; foreach (const QSerialPortInfo &serialPortInfo, serialPortInfos) { qDebug() << " " << serialPortInfo.portName() << ": " << serialPortInfo.description(); } // 打开串口并设置参数 QSerialPort serialPort; serialPort.setPortName(serialPortInfos.first().portName()); serialPort.setBaudRate(QSerialPort::Baud115200); serialPort.setDataBits(QSerialPort::Data8); serialPort.setParity(QSerialPort::NoParity); serialPort.setStopBits(QSerialPort::OneStop); serialPort.setFlowControl(QSerialPort::NoFlowControl); if (!serialPort.open(QIODevice::ReadWrite)) { qWarning() << "Failed to open serial port!"; return 1; } // 发送数据 QByteArray sendData("Hello, world!"); qint64 bytesWritten = serialPort.write(sendData); if (bytesWritten == -1) { qWarning() << "Failed to write data to serial port!"; return 1; } qDebug() << "Sent " << bytesWritten << " bytes: " << sendData; // 接收数据 QByteArray receivedData; while (serialPort.waitForReadyRead(1000)) { receivedData.append(serialPort.readAll()); } qDebug() << "Received " << receivedData.size() << " bytes: " << receivedData; // 关闭串口 serialPort.close(); return 0; } ``` 这个示例代码中,我们首先使用QSerialPortInfo类查找可用的串口,并输出它们的信息。然后,我们打开第一个可用的串口,并设置通信参数。接着,我们发送一个字符串数据,等待接收下位机的响应,并输出接收到的数据。最后,我们关闭串口。 需要注意的是,这里只是一个简单的示例代码,你需要根据具体的应用场景进行修改和完善。同时,还需要注意Qt中串口通信的一些细节问题,例如读写数据时的超时处理、数据格式的解析等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值