C#通信串口,TCP,Socket,Modbus
C# 串口通信
C# 串口通信技术文章大纲
串口通信基础
- 串口通信的概念与应用场景
- 常见的串口参数(波特率、数据位、停止位、校验位)
- RS-232、RS-485 等常见串口标准
C# 中的串口通信类库
System.IO.Ports命名空间介绍SerialPort类的核心属性和方法- 跨平台串口通信的替代方案(如
SerialPortStream)
串口通信的基本实现步骤
- 初始化
SerialPort对象并配置参数 - 打开和关闭串口连接
- 数据的发送与接收(字节流与字符串转换)
事件驱动的数据接收
DataReceived事件的使用- 异步读取串口数据的实现方式
- 缓冲区管理与数据处理技巧
常见问题与调试方法
- 串口通信中的常见错误(如超时、数据丢失)
- 使用工具(如串口调试助手)进行测试
- 日志记录与异常处理的最佳实践
高级应用场景
- 多线程环境下的串口通信
- 自定义协议解析(如 Modbus)
- 结合网络通信实现远程串口控制
示例代码
- 基础的串口读写示例
- 事件驱动接收数据的完整代码
- 协议解析的代码片段
总结与扩展阅读
- 串口通信在工业自动化、嵌入式系统中的应用
- 推荐学习资源(官方文档、开源项目)
SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
serialPort.Open();
serialPort.WriteLine("Hello Serial Port");
string response = serialPort.ReadLine();
serialPort.Close();
关键参数包括端口名称(如 COM1)、波特率、校验位、数据位和停止位。需处理 DataReceived 事件实现异步接收。
C# TCP 通信
TCP(传输控制协议)是一种面向连接的、可靠的网络协议,适用于需要数据完整性和顺序传输的场景。在 C# 中,System.Net.Sockets 命名空间提供了 TcpClient 和 TcpListener 类,用于简化 TCP 通信的实现。
服务端实现
使用 TcpListener 监听指定端口并接受客户端连接:
using System.Net;
using System.Net.Sockets;
using System.Text;
TcpListener server = new TcpListener(IPAddress.Any, 8080);
server.Start();
Console.WriteLine("Server started. Waiting for connections...");
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Received: {receivedData}");
stream.Close();
client.Close();
server.Stop();
客户端实现
通过 TcpClient 连接到服务端并发送数据:
using System.Net.Sockets;
using System.Text;
TcpClient client = new TcpClient();
client.Connect("127.0.0.1", 8080);
NetworkStream stream = client.GetStream();
string message = "Hello, Server!";
byte[] data = Encoding.UTF8.GetBytes(message);
stream.Write(data, 0, data.Length);
stream.Close();
client.Close();
异步通信
使用异步方法处理多客户端连接或非阻塞操作:
// 服务端异步接收
async Task HandleClientAsync(TcpClient client)
{
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Async Received: {receivedData}");
}
// 客户端异步发送
async Task SendDataAsync(string message)
{
TcpClient client = new TcpClient();
await client.ConnectAsync("127.0.0.1", 8080);
NetworkStream stream = client.GetStream();
byte[] data = Encoding.UTF8.GetBytes(message);
await stream.WriteAsync(data, 0, data.Length);
}
错误处理
添加异常处理以应对网络中断或无效连接:
try
{
TcpClient client = new TcpClient();
client.Connect("127.0.0.1", 8080);
}
catch (SocketException ex)
{
Console.WriteLine($"Connection failed: {ex.Message}");
}
数据传输优化
- 缓冲区管理:根据实际数据大小动态调整缓冲区。
- 协议设计:定义消息头(如长度前缀)以支持分段传输。
- 心跳机制:定期发送心跳包检测连接状态。
应用场景
- 实时聊天应用
- 文件传输服务
- 远程控制工具
通过上述方法,可以快速实现 C# 中的 TCP 通信功能,并根据需求扩展为更复杂的网络应用。
C# Socket 通信
Socket 是网络通信的基础,C# 通过 System.Net.Sockets 命名空间提供了对 Socket 编程的支持。以下是一些关键概念和示例代码。
创建 TCP Socket 服务器
使用 TcpListener 可以快速创建一个 TCP 服务器:
using System.Net;
using System.Net.Sockets;
using System.Text;
TcpListener server = new TcpListener(IPAddress.Any, 8080);
server.Start();
Console.WriteLine("Server started...");
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Received: {data}");
stream.Close();
client.Close();
server.Stop();
创建 TCP Socket 客户端
客户端使用 TcpClient 连接到服务器:
using System.Net.Sockets;
using System.Text;
TcpClient client = new TcpClient("127.0.0.1", 8080);
NetworkStream stream = client.GetStream();
string message = "Hello, Server!";
byte[] data = Encoding.ASCII.GetBytes(message);
stream.Write(data, 0, data.Length);
stream.Close();
client.Close();
使用 UDP Socket
UDP 是无连接的协议,适合广播或简单消息传输:
// UDP Server
UdpClient udpServer = new UdpClient(8080);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
byte[] receivedData = udpServer.Receive(ref remoteEP);
Console.WriteLine($"Received: {Encoding.ASCII.GetString(receivedData)}");
// UDP Client
UdpClient udpClient = new UdpClient();
byte[] sendData = Encoding.ASCII.GetBytes("Hello, UDP!");
udpClient.Send(sendData, sendData.Length, "127.0.0.1", 8080);
异步 Socket 编程
异步操作可以避免阻塞主线程:
// 异步 TCP 服务器示例
TcpListener listener = new TcpListener(IPAddress.Any, 8080);
listener.Start();
listener.BeginAcceptTcpClient(new AsyncCallback(AcceptCallback), listener);
void AcceptCallback(IAsyncResult ar)
{
TcpListener listener = (TcpListener)ar.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(ar);
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReadCallback), stream);
}
void ReadCallback(IAsyncResult ar)
{
NetworkStream stream = (NetworkStream)ar.AsyncState;
int bytesRead = stream.EndRead(ar);
Console.WriteLine($"Received: {Encoding.ASCII.GetString(buffer, 0, bytesRead)}");
}
Socket 异常处理
网络操作可能会抛出异常,需要妥善处理:
try
{
TcpClient client = new TcpClient("127.0.0.1", 8080);
// ...其他操作
}
catch (SocketException ex)
{
Console.WriteLine($"Socket error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"General error: {ex.Message}");
}
性能优化建议
设置缓冲区大小和超时可以提高性能:
TcpClient client = new TcpClient();
client.ReceiveBufferSize = 8192; // 8KB
client.SendBufferSize = 8192;
client.ReceiveTimeout = 5000; // 5秒
client.SendTimeout = 5000;
这些示例展示了 C# 中 Socket 编程的基本用法。实际应用中可能需要更复杂的错误处理和协议设计。
C# Modbus 通信
Modbus协议简介
Modbus是一种串行通信协议,广泛应用于工业自动化领域,支持主从设备间的数据交换。协议分为RTU(二进制)、ASCII(文本)和TCP/IP(基于网络)三种模式。C#可通过开源库(如NModbus)或直接实现协议与Modbus设备交互。
使用NModbus库
NModbus是流行的C# Modbus库,支持RTU和TCP模式。需通过NuGet安装:
Install-Package NModbus
TCP模式示例
using Modbus.Device;
var master = ModbusIpMaster.CreateIp(new TcpClient("192.168.1.1", 502));
ushort[] registers = master.ReadHoldingRegisters(1, 0, 10); //从站地址1,寄存器0开始读10个
RTU模式示例
需指定串口和从站地址:
using System.IO.Ports;
using Modbus.Device;
SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
var master = ModbusSerialMaster.CreateRtu(port);
bool[] coils = master.ReadCoils(1, 0, 5); //读取从站1的5个线圈状态
手动实现Modbus TCP
若需轻量级实现,可直接处理TCP套接字:
using System.Net.Sockets;
byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x00, 0x00, 0x0A };
using (TcpClient client = new TcpClient("192.168.1.1", 502))
using (NetworkStream stream = client.GetStream())
{
stream.Write(request, 0, request.Length);
byte[] response = new byte[256];
int bytesRead = stream.Read(response, 0, response.Length);
//解析响应数据(如寄存器值)
}
注意事项
- 超时处理:网络或串口操作需设置超时(如
SerialPort.ReadTimeout)。 - 线程安全:多线程环境下需同步访问串口或TCP连接。
- 协议细节:需遵循Modbus协议规范处理功能码、CRC校验(RTU模式)等。
调试工具推荐
- Modbus Poll/MasterSim:模拟主从设备测试通信。
- Wireshark:抓包分析TCP模式数据流。
通过上述方法,可灵活实现C#与Modbus设备的通信,适用于PLC、传感器等工业设备集成。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)