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.TcpClientTcpListener类。
  • 实现客户端和服务器端的通信。

示例代码(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

 

posted @ 2025-05-29 14:15  春天又来了  阅读(442)  评论(0)    收藏  举报