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
功能 :通过TcpClient或Socket提供流操作,简化网络数据的读写。
核心方法:
-
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 -
网络通信需注意权限(如防火墙、端口占用)
-
串口通信需确保设备已正确连接并安装驱动