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 命名空间提供了 TcpClientTcpListener 类,用于简化 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、传感器等工业设备集成。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐