C#- 各种通讯代码示例
1. 串口通信(RS232/RS485)
串口通信是上位机与下位机之间最常见的通信方式,适用于短距离、低速率的通信场景。
实现方法:
- 使用
System.IO.Ports.SerialPort类。 - 设置串口参数:波特率、数据位、停止位、校验位等。
using System;
using System.IO.Ports;
class SerialCommunication
{
static void Main(string[] args)
{
SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
serialPort.DataReceived += SerialPort_DataReceived; // 数据接收事件
serialPort.Open();
Console.WriteLine("串口已打开,等待数据...");
serialPort.WriteLine("Hello Device"); // 发送数据
Console.ReadLine();
serialPort.Close();
}
private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender; string data = sp.ReadExisting(); // 读取数据
Console.WriteLine("收到数据: " + data);
}
}
2. TCP/IP通信
TCP/IP通信适用于网络环境下的远程通信,支持高速率、远距离的数据传输。
实现方法:
- 使用
System.Net.Sockets.TcpClient和TcpListener类。 - 实现客户端和服务器端的通信。
示例代码(TCP客户端):
using System;
using System.Net.Sockets;
using System.Text;
class TcpClientExample {
static void Main(string[] args) {
TcpClient client = new TcpClient("127.0.0.1", 5000); // 连接服务器
NetworkStream stream = client.GetStream(); // 发送数据
byte[] buffer = Encoding.ASCII.GetBytes("Hello Server");
stream.Write(buffer, 0, buffer.Length); // 接收数据
buffer = new byte[256];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("收到服务器响应: " + response);
client.Close();
}
}
示例代码(TCP服务器):
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class TcpServerExample {
static void Main(string[] args) {
TcpListener listener = new TcpListener(IPAddress.Any, 5000);
listener.Start();
Console.WriteLine("服务器已启动,等待客户端连接...");
TcpClient client = listener.AcceptTcpClient();
NetworkStream stream = client.GetStream(); // 接收数据
byte[] buffer = new byte[256];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string request = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("收到客户端数据: " + request); // 发送响应
byte[] response = Encoding.ASCII.GetBytes("Hello Client");
stream.Write(response, 0, response.Length);
client.Close();
listener.Stop();
}
}
3. UDP通信
UDP是一种无连接的通信协议,适用于对实时性要求高、但可靠性要求不高的场景。
实现方法:
- 使用
System.Net.Sockets.UdpClient类。
示例代码(UDP客户端):
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class UdpClientExample
{
static void Main(string[] args)
{
UdpClient udpClient = new UdpClient();
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000);
// 发送数据
byte[] buffer = Encoding.ASCII.GetBytes("Hello Server");
udpClient.Send(buffer, buffer.Length, serverEndPoint);
// 接收数据
buffer = udpClient.Receive(ref serverEndPoint);
string response = Encoding.ASCII.GetString(buffer);
Console.WriteLine("收到服务器响应: " + response);
udpClient.Close();
}
}
4. Modbus通信
Modbus是一种工业通信协议,常用于PLC、传感器等设备的通信。
实现方法:
- 使用第三方库(如NModbus)实现Modbus RTU(串口)或Modbus TCP(网络)。
示例代码(Modbus TCP):
using System;
using Modbus.Device;
using Modbus.Data;
using Modbus.Utility;
class ModbusExample
{
static void Main(string[] args)
{
TcpClient tcpClient = new TcpClient("127.0.0.1", 502);
ModbusIpMaster master = ModbusIpMaster.CreateIp(tcpClient);
// 读取保持寄存器
ushort[] registers = master.ReadHoldingRegisters(0, 10);
for (int i = 0; i < registers.Length; i++)
{
Console.WriteLine($"寄存器 {i}: {registers[i]}");
}
tcpClient.Close();
}
}
5. CAN总线通信
CAN总线常用于汽车电子和工业控制领域。
实现方法:
- 使用硬件厂商提供的SDK或第三方库(如PCAN-Basic API)。
示例代码(使用PCAN-Basic API):
using System;
using Peak.Can.Basic;
class CanExample
{
static void Main(string[] args)
{
TPCANHandle channel = TPCANHandle.PCAN_USBBUS1;
TPCANBaudrate baudrate = TPCANBaudrate.PCAN_BAUD_500K;
TPCANStatus result = PCANBasic.Initialize(channel, baudrate);
if (result == TPCANStatus.PCAN_ERROR_OK)
{
Console.WriteLine("CAN通道初始化成功");
// 发送和接收CAN消息
}
else
{
Console.WriteLine("CAN通道初始化失败");
}
}
}
6. USB通信
USB通信适用于与USB设备(如数据采集卡、传感器)的交互。
实现方法:
- 使用
LibUsbDotNet等第三方库。
示例代码:
using System;
using LibUsbDotNet;
using LibUsbDotNet.Main;
class UsbExample
{
static void Main(string[] args)
{
UsbDeviceFinder finder = new UsbDeviceFinder(0x1234, 0x5678); // 设备ID
UsbDevice device = UsbDevice.OpenUsbDevice(finder);
if (device != null)
{
Console.WriteLine("USB设备已连接");
// 发送和接收数据
device.Close();
}
else
{
Console.WriteLine("未找到USB设备");
}
}
}
7. MQTT通信
MQTT是一种轻量级的发布/订阅消息协议,适用于物联网场景。
实现方法:
- 使用第三方库(如MQTTnet)。
示例代码:
using System;
using System.Text;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
class MqttExample
{
static async Task Main(string[] args)
{
var factory = new MqttFactory();
var client = factory.CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("broker.hivemq.com", 1883) // MQTT服务器地址
.Build();
await client.ConnectAsync(options);
await client.PublishAsync(new MqttApplicationMessageBuilder()
.WithTopic("test/topic")
.WithPayload("Hello MQTT")
.Build());
Console.WriteLine("消息已发送");
}
}
总结
C#上位机通信方式多样,具体选择取决于应用场景和硬件设备。常见的通信方式包括:
- 串口通信:适合短距离、低速率的场景。
- TCP/IP通信:适合网络环境下的远程通信。
- Modbus通信:适合工业设备通信。
- CAN总线通信:适合汽车电子和工业控制。
- USB通信:适合与USB设备交互。
- MQTT通信:适合物联网场景。
根据项目需求选择合适的通信方式,并结合多线程、异步编程等技术实现高效的上位机程序。
如果有具体问题,欢迎进一步讨论!
原文网址:https://zhuanlan.zhihu.com/p/16122437966
浙公网安备 33010602011771号