首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【读取串口技术】

【读取串口技术】

作者头像
贺公子之数据科学与艺术
发布2025-08-29 11:49:13
发布2025-08-29 11:49:13
2290
举报
在这里插入图片描述
在这里插入图片描述

一个使用C#读取串口通讯的示例程序:

代码语言:javascript
复制
using System;
using System.IO.Ports;

class Program
{
    static void Main(string[] args)
    {
        // 创建串口对象
        SerialPort serialPort = new SerialPort();

        // 设置串口参数
        serialPort.PortName = "COM1";
        serialPort.BaudRate = 9600;
        serialPort.Parity = Parity.None;
        serialPort.DataBits = 8;
        serialPort.StopBits = StopBits.One;

        // 打开串口
        serialPort.Open();

        // 注册数据接收事件处理方法
        serialPort.DataReceived += SerialPort_DataReceived;

        // 等待用户按下任意键退出程序
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();

        // 关闭串口
        serialPort.Close();
    }

    static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // 强制转换为SerialPort对象
        SerialPort serialPort = (SerialPort)sender;

        // 读取串口接收缓冲区中的数据
        string data = serialPort.ReadExisting();

        // 处理接收到的数据(打印或其他操作)
        Console.WriteLine("Received Data: " + data);
    }
}

这个示例程序创建了一个SerialPort对象,设置了串口参数,并打开了串口。然后注册了一个数据接收事件处理方法,当串口接收到数据时会调用这个方法。在事件处理方法中,我们可以读取串口接收缓冲区中的数据,并进行处理(例如打印数据)。最后,程序等待用户按下任意键退出,并在退出前关闭了串口。请根据实际情况修改串口参数和处理接收到的数据的逻辑。

一个使用jCommSerial库读取串口通讯的示例程序:

代码语言:javascript
复制
import jssc.SerialPort;
import jssc.SerialPortException;
import jssc.SerialPortList;

public class SerialCommunicationReader {

    public static void main(String[] args) {
        // 获取可用的串口列表
        String[] portNames = SerialPortList.getPortNames();

        // 打开第一个可用的串口
        SerialPort serialPort = new SerialPort(portNames[0]);
        try {
            serialPort.openPort();

            // 设置串口参数,如波特率、数据位、停止位等
            serialPort.setParams(SerialPort.BAUDRATE_9600,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);

            // 设置串口监听器
            serialPort.addEventListener(event -> {
                if (event.isRXCHAR()) { // 如果收到数据
                    try {
                        // 读取并输出收到的数据
                        byte[] buffer = serialPort.readBytes(event.getEventValue());
                        System.out.println(new String(buffer));
                    } catch (SerialPortException e) {
                        e.printStackTrace();
                    }
                }
            });

            // 读取数据直到程序退出
            while (true) {
                // do nothing
            }
        } catch (SerialPortException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭串口
                serialPort.closePort();
            } catch (SerialPortException e) {
                e.printStackTrace();
            }
        }
    }
}

这个示例程序使用了jCommSerial库来读取串口通讯。它首先获取可用的串口列表,然后打开第一个可用的串口。接下来,通过设置串口参数来配置串口,如波特率、数据位、停止位等。然后,设置串口监听器来接收串口收到的数据,并在收到数据时将其输出到控制台。最后,程序进入一个无限循环,持续读取串口数据,直到程序退出。在程序退出时,需要手动调用closePort()方法来关闭串口。

请注意,jCommSerial库需要在项目中引入。你可以在jCommSerial的官方网站(https://github.com/NeuronRobotics/nrjavaserial)上找到该库的下载和使用说明。

使用C++串口库来读取串口通讯

以下是一个简单的示例程序:

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <windows.h>  // Windows下的串口库头文件

int main() {
    HANDLE hSerial;
    DCB dcbSerialParams = { 0 };
    COMMTIMEOUTS timeouts = { 0 };

    // 打开串口
    hSerial = CreateFile("COM1", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hSerial == INVALID_HANDLE_VALUE) {
        std::cout << "Failed to open serial port." << std::endl;
        return 1;
    }

    // 配置串口参数
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams)) {
        std::cout << "Failed to get serial port state." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }
    dcbSerialParams.BaudRate = CBR_9600;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if (!SetCommState(hSerial, &dcbSerialParams)) {
        std::cout << "Failed to set serial port state." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    // 设置串口读取超时时间
    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;
    if (!SetCommTimeouts(hSerial, &timeouts)) {
        std::cout << "Failed to set serial port timeouts." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    // 读取串口数据
    char buffer[1024];
    DWORD bytesRead;
    while (true) {
        if (!ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL)) {
            std::cout << "Failed to read from serial port." << std::endl;
            CloseHandle(hSerial);
            return 1;
        }

        if (bytesRead > 0) {
            std::string receivedData(buffer, bytesRead);
            std::cout << "Received data: " << receivedData << std::endl;
        }
    }

    // 关闭串口
    CloseHandle(hSerial);

    return 0;
}

上述示例程序实现了打开串口 COM1,并读取串口数据,然后将读取到的数据打印到终端。你可以根据需要修改串口名称和参数。注意,在使用该示例程序之前,你需要安装 Windows 下的串口库,并将其链接到你的项目中。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一个使用C#读取串口通讯的示例程序:
  • 一个使用jCommSerial库读取串口通讯的示例程序:
  • 使用C++串口库来读取串口通讯
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档