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
-
网络通信需注意权限(如防火墙、端口占用)
-
串口通信需确保设备已正确连接并安装驱动