C# 通讯关键类的API

1. SerialPort(串口通信)

命名空间System.IO.Ports

功能:控制串口通信,支持数据发送 / 接收、参数配置(波特率、校验位等)。

核心属性 / 方法:
  • PortName:串口名称(如 "COM1")

  • BaudRate:波特率(如 9600)

  • Parity:校验位(None/Odd/Even等)

  • DataBits:数据位(通常 8)

  • StopBits:停止位(通常One

  • Open():打开串口

  • Close():关闭串口

  • Write(byte[] buffer, int offset, int count):发送数据

  • Read(byte[] buffer, int offset, int count):读取数据

  • DataReceived:数据接收事件

示例:
复制代码
using System;
using System.IO.Ports;
​
class SerialPortDemo
{
    static SerialPort _serialPort;
​
    static void Main()
    {
        // 初始化串口
        _serialPort = new SerialPort("COM1")
        {
            BaudRate = 9600,
            Parity = Parity.None,
            DataBits = 8,
            StopBits = StopBits.One,
            ReadTimeout = 500,  // 读取超时时间(ms)
            WriteTimeout = 500  // 写入超时时间(ms)
        };
​
        // 绑定数据接收事件
        _serialPort.DataReceived += SerialPort_DataReceived;
​
        try
        {
            _serialPort.Open();
            Console.WriteLine("串口已打开,发送数据...");
            
            // 发送数据
            byte[] sendData = new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A };
            _serialPort.Write(sendData, 0, sendData.Length);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"错误:{ex.Message}");
        }
​
        Console.ReadLine();
        _serialPort.Close();
    }
​
    // 数据接收事件处理
    static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        int bytesToRead = _serialPort.BytesToRead;
        byte[] recvData = new byte[bytesToRead];
        _serialPort.Read(recvData, 0, bytesToRead);
        
        Console.WriteLine($"接收数据:{BitConverter.ToString(recvData)}");
    }
}

2. SerialDataReceivedEventArgs(串口数据接收事件参数)

命名空间System.IO.Ports

功能 :提供SerialPort.DataReceived事件的附加信息。

核心属性:
  • EventType:获取数据接收类型(Chars:字符数据;Eof:流结束)
示例(结合SerialPort):
复制代码
static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if (e.EventType == SerialData.Chars)
    {
        // 处理字符数据
        int bytes = _serialPort.BytesToRead;
        byte[] data = new byte[bytes];
        _serialPort.Read(data, 0, bytes);
        Console.WriteLine($"接收字符数据:{BitConverter.ToString(data)}");
    }
    else if (e.EventType == SerialData.Eof)
    {
        Console.WriteLine("接收流结束符");
    }
}

3. ModbusSerialMaster(Modbus RTU 通信)

说明 :属于第三方库NModbus(需通过 NuGet 安装),用于 Modbus RTU 主站通信。

命名空间Modbus.Device

核心方法:
  • ReadHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints):读取保持寄存器

  • WriteSingleRegister(byte slaveAddress, ushort registerAddress, ushort value):写入单个寄存器

  • ReadCoils(byte slaveAddress, ushort startAddress, ushort numberOfPoints):读取线圈状态

示例:
复制代码
using System;
using System.IO.Ports;
using Modbus.Device;
​
class ModbusRtuDemo
{
    static void Main()
    {
        // 初始化串口
        using (SerialPort port = new SerialPort("COM1"))
        {
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.Even;
            port.StopBits = StopBits.One;
            port.Open();
​
            // 创建Modbus RTU主站
            IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
            
            // 从站地址1,读取起始地址0的1个保持寄存器
            ushort[] registers = master.ReadHoldingRegisters(1, 0, 1);
            Console.WriteLine($"读取到寄存器值:{registers[0]}");
​
            // 写入值0x1234到从站1的地址0寄存器
            master.WriteSingleRegister(1, 0, 0x1234);
            Console.WriteLine("写入完成");
        }
    }
}

4. ModbusIpMaster(Modbus TCP 通信)

说明 :同样来自NModbus库,用于 Modbus TCP 主站通信。

命名空间Modbus.Device

核心方法:
  • ModbusSerialMaster类似,但通过 IP 连接,无需从站地址(用 UnitId 替代)
示例:
复制代码
using System;
using System.Net.Sockets;
using Modbus.Device;
​
class ModbusTcpDemo
{
    static void Main()
    {
        // 连接Modbus TCP从机(IP:192.168.1.100,端口:502)
        using (TcpClient client = new TcpClient("192.168.1.100", 502))
        {
            // 创建Modbus TCP主站
            IModbusIpMaster master = ModbusIpMaster.CreateIp(client);
            
            // UnitId=1,读取起始地址0的1个保持寄存器
            ushort[] registers = master.ReadHoldingRegisters(1, 0, 1);
            Console.WriteLine($"读取到寄存器值:{registers[0]}");
        }
    }
}

5. Socket(底层网络通信)

命名空间System.Net.Sockets

功能:支持 TCP/UDP 等低级网络通信,提供灵活的字节级操作。

核心方法:
  • Bind(EndPoint localEP):绑定本地端点

  • Listen(int backlog):开始监听连接(TCP)

  • Accept():接受客户端连接(TCP)

  • Connect(EndPoint remoteEP):连接远程端点(TCP)

  • Send(byte[] buffer):发送数据

  • Receive(byte[] buffer):接收数据

  • Close():关闭 Socket

示例(TCP 服务器):
复制代码
using System;
using System.Net;
using System.Net.Sockets;
​
class SocketTcpServer
{
    static void Main()
    {
        // 创建TCP Socket
        using (Socket serverSocket = new Socket(AddressFamily.InterNetwork, 
                                               SocketType.Stream, 
                                               ProtocolType.Tcp))
        {
            // 绑定本地端点(IP:本机所有地址,端口:8888)
            IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 8888);
            serverSocket.Bind(localEndPoint);
            
            // 开始监听(最大队列长度10)
            serverSocket.Listen(10);
            Console.WriteLine("服务器启动,等待连接...");
​
            // 接受客户端连接
            using (Socket clientSocket = serverSocket.Accept())
            {
                Console.WriteLine($"客户端连接:{clientSocket.RemoteEndPoint}");
​
                // 接收数据
                byte[] buffer = new byte[1024];
                int recvLen = clientSocket.Receive(buffer);
                string recvMsg = Encoding.UTF8.GetString(buffer, 0, recvLen);
                Console.WriteLine($"接收:{recvMsg}");
​
                // 发送响应
                byte[] sendData = Encoding.UTF8.GetBytes("收到消息");
                clientSocket.Send(sendData);
            }
        }
    }
}

6. TcpListener(TCP 监听)

命名空间System.Net.Sockets

功能 :简化 TCP 服务器的监听逻辑,封装了Socket的部分操作。

核心方法:
  • Start():开始监听

  • AcceptTcpClient():接受客户端连接(返回TcpClient

  • Stop():停止监听

示例:
复制代码
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
​
class TcpListenerDemo
{
    static void Main()
    {
        // 创建监听器(监听端口8888)
        TcpListener server = new TcpListener(IPAddress.Any, 8888);
        server.Start();
        Console.WriteLine("服务器启动,等待连接...");
​
        // 接受客户端
        using (TcpClient client = server.AcceptTcpClient())
        using (NetworkStream stream = client.GetStream())
        {
            byte[] buffer = new byte[1024];
            int bytesRead = stream.Read(buffer, 0, buffer.Length);
            string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine($"收到:{message}");
​
            // 发送响应
            byte[] response = Encoding.UTF8.GetBytes("Hello Client");
            stream.Write(response, 0, response.Length);
        }
​
        server.Stop();
    }
}

7. UdpClient(UDP 通信)

命名空间System.Net.Sockets

功能:简化 UDP 数据报的发送 / 接收,无需建立连接。

核心方法:
  • Send(byte[] dgram, int bytes, IPEndPoint endPoint):发送数据报

  • Receive(ref IPEndPoint remoteEP):接收数据报(返回字节数组)

示例:
复制代码
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
​
class UdpDemo
{
    static void Main()
    {
        // 发送端
        using (UdpClient sender = new UdpClient())
        {
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Loopback, 8888); // 本地测试
            byte[] data = Encoding.UTF8.GetBytes("Hello UDP");
            sender.Send(data, data.Length, remoteEP);
            Console.WriteLine("发送完成");
        }
​
        // 接收端
        using (UdpClient receiver = new UdpClient(8888))
        {
            IPEndPoint senderEP = new IPEndPoint(IPAddress.Any, 0);
            byte[] recvData = receiver.Receive(ref senderEP); // 阻塞等待
            string message = Encoding.UTF8.GetString(recvData);
            Console.WriteLine($"从{senderEP}收到:{message}");
        }
    }
}

8. IPAddress(IP 地址)

命名空间System.Net

功能:表示 IP 地址(IPv4/IPv6)。

核心方法 / 属性:
  • Parse(string ipString):解析 IP 字符串(如 "192.168.1.1")

  • TryParse(string ipString, out IPAddress address):安全解析

  • AddressFamily:获取地址族(InterNetwork=IPv4,InterNetworkV6=IPv6)

  • Loopback:回环地址(IPv4 为 127.0.0.1)

示例:
复制代码
using System;
using System.Net;
​
class IPAddressDemo
{
    static void Main()
    {
        // 解析IPv4地址
        IPAddress ip = IPAddress.Parse("192.168.1.100");
        Console.WriteLine($"IP地址:{ip},类型:{ip.AddressFamily}");
​
        // 回环地址
        Console.WriteLine($"回环地址:{IPAddress.Loopback}");
​
        // 安全解析
        if (IPAddress.TryParse("256.0.0.1", out IPAddress invalidIp))
        {
            Console.WriteLine("有效IP");
        }
        else
        {
            Console.WriteLine("无效IP"); // 此处会执行
        }
    }
}

9. NetworkStream(网络流)

命名空间System.Net.Sockets

功能 :通过TcpClientSocket提供流操作,简化网络数据的读写。

核心方法:
  • Read(byte[] buffer, int offset, int size):从流读取数据

  • Write(byte[] buffer, int offset, int size):向流写入数据

  • Flush():刷新流

  • Close():关闭流

示例(结合TcpClient):
复制代码
using System;
using System.Net.Sockets;
using System.Text;

class NetworkStreamDemo
{
    static void Main()
    {
        using (TcpClient client = new TcpClient("localhost", 8888))
        using (NetworkStream stream = client.GetStream())
        {
            // 发送数据
            byte[] sendData = Encoding.UTF8.GetBytes("Hello Server");
            stream.Write(sendData, 0, sendData.Length);

            // 接收响应
            byte[] recvBuffer = new byte[1024];
            int recvLen = stream.Read(recvBuffer, 0, recvBuffer.Length);
            string response = Encoding.UTF8.GetString(recvBuffer, 0, recvLen);
            Console.WriteLine($"服务器响应:{response}");
        }
    }
}

10. IPEndPoint(IP 端点)

命名空间System.Net

功能:表示 IP 地址和端口的组合,用于标识网络中的端点。

构造函数:
  • IPEndPoint(IPAddress address, int port):通过 IP 地址和端口创建
示例:
复制代码
using System;
using System.Net;

class IPEndPointDemo
{
    static void Main()
    {
        IPAddress ip = IPAddress.Parse("192.168.1.1");
        int port = 8080;
        
        // 创建端点
        IPEndPoint endPoint = new IPEndPoint(ip, port);
        Console.WriteLine($"端点:{endPoint}"); // 输出 192.168.1.1:8080
    }
}

11. Stream(基础流)

命名空间System.IO

功能:抽象基类,代表字节流(文件流、网络流等均继承自此)。

核心方法(抽象):
  • Read(byte[] buffer, int offset, int count):读取字节

  • Write(byte[] buffer, int offset, int count):写入字节

  • Flush():刷新缓冲区

  • Close():关闭流

示例(通用流操作):
复制代码
using System;
using System.IO;
using System.Text;

class StreamDemo
{
    static void Main()
    {
        // 网络流示例(也可替换为FileStream等)
        using (TcpClient client = new TcpClient("localhost", 8888))
        using (Stream stream = client.GetStream())
        {
            // 写入
            byte[] data = Encoding.UTF8.GetBytes("Test Stream");
            stream.Write(data, 0, data.Length);
            
            // 读取
            byte[] buffer = new byte[1024];
            int read = stream.Read(buffer, 0, buffer.Length);
            Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, read));
        }
    }
}

12. Encoding(字符编码)

命名空间System.Text

功能:处理字符与字节数组的转换(如 UTF-8、ASCII)。

核心方法:
  • GetBytes(string s):字符串转字节数组

  • GetString(byte[] bytes):字节数组转字符串

  • UTF8/ASCII/Unicode:预定义编码实例

示例:
复制代码
using System;
using System.Text;

class EncodingDemo
{
    static void Main()
    {
        string text = "你好,World!";
        
        // UTF-8编码
        byte[] utf8Bytes = Encoding.UTF8.GetBytes(text);
        Console.WriteLine($"UTF-8字节:{BitConverter.ToString(utf8Bytes)}");
        
        // 解码
        string decoded = Encoding.UTF8.GetString(utf8Bytes);
        Console.WriteLine($"解码后:{decoded}");

        // ASCII编码(中文会丢失)
        byte[] asciiBytes = Encoding.ASCII.GetBytes(text);
        Console.WriteLine($"ASCII字节:{BitConverter.ToString(asciiBytes)}");
    }
}

补充说明:

  • 第三方库(如NModbus)需通过 NuGet 安装:Install-Package NModbus

  • 网络通信需注意权限(如防火墙、端口占用)

  • 串口通信需确保设备已正确连接并安装驱动

相关推荐
froginwe117 小时前
R 数组:深入解析与高效使用
开发语言
tao3556677 小时前
【Python刷力扣hot100】283. Move Zeroes
开发语言·python·leetcode
progalchemist7 小时前
Quick SwiftObjective-C测试框架入门教程
开发语言·其他·objective-c·swift
z日火7 小时前
Java 泛型
java·开发语言
广药门徒7 小时前
Linux(含嵌入式设备如泰山派)VNC 完整配置指南:含开机自启动(适配 Ubuntu/Debian 系)
开发语言·php
不做无法实现的梦~8 小时前
jetson刷系统之后没有浏览器--解决办法
开发语言·javascript·ecmascript
一只小松许️8 小时前
深入理解:Rust 的内存模型
java·开发语言·rust
eqwaak09 小时前
数据预处理与可视化流水线:Pandas Profiling + Altair 实战指南
开发语言·python·信息可视化·数据挖掘·数据分析·pandas