当前位置: 首页 > article >正文

浅谈C#之485通讯

一、基本介绍

        C#中实现485通讯,通常指的是使用RS-485串行通信接口。RS-485是一种半双工通信标准,常用于工业环境中的设备之间的通信。

二、简单示例

打开串口:首先,你需要创建一个SerialPort对象,并设置其参数,如端口名、波特率、数据位、停止位和奇偶校验位。然后打开串口。

SerialPort sp = new SerialPort();
sp.PortName = "COM1"; // 串口名称
sp.BaudRate = 9600; // 波特率
sp.DataBits = 8; // 数据位
sp.StopBits = StopBits.One; // 停止位
sp.Parity = Parity.None; // 奇偶校验
sp.Open(); // 打开串口

发送数据:使用SerialPort类的Write方法发送数据。你可以发送字节数组或字符串。

byte[] data = new byte[] { 0x01, 0x02, 0x03 };
sp.Write(data, 0, data.Length); // 发送字节数组

接收数据:使用SerialPort类的Read方法接收数据。你可以读取到一个字节数组中。

byte[] buffer = new byte[1024];
int count = sp.Read(buffer, 0, buffer.Length); // 读取数据到buffer

关闭串口:通信完成后,使用SerialPort类的Close方法关闭串口。

sp.Close(); // 关闭串口

在处理RS485通信时,你可能还需要控制RTS和DTR引脚来管理发送和接收模式,因为RS485通常使用半双工通信。例如,要将设备设置为发送模式,你可以将RTS和DTR引脚置低。

sp.RtsEnable = false; // 将RS485设置为发送模式
sp.DtrEnable = false;

要将设备设置为接收模式,你可以将RTS和DTR引脚置高。

sp.RtsEnable = true; // 将RS485设置为接收模式
sp.DtrEnable = true;

三、完整示例

using System;
using System.IO.Ports;
 
class RS485Communication
{
    private SerialPort serialPort;
 
    public RS485Communication(string portName)
    {
        serialPort = new SerialPort(portName, 9600); // 设置COM端口和波特率
        serialPort.DataBits = 8;
        serialPort.Parity = Parity.Even; // 根据需要设置奇偶校验位
        serialPort.StopBits = StopBits.One;
        serialPort.Handshake = Handshake.RequestToSend; // 设置握手方式,RS-485通常使用RequestToSend或XOnXOff
    }
 
    public void Open()
    {
        try
        {
            if (!serialPort.IsOpen)
            {
                serialPort.Open();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error opening port: " + ex.Message);
        }
    }
 
    public void Close()
    {
        if (serialPort.IsOpen)
        {
            serialPort.Close();
        }
    }
 
    public void SendData(string data)
    {
        if (serialPort.IsOpen)
        {
            serialPort.WriteLine(data);
        }
        else
        {
            Console.WriteLine("Port is not open.");
        }
    }
 
    public void ReceiveData()
    {
        serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    }
 
    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.WriteLine(indata);
    }
}
 
// 使用方法
RS485Communication comm = new RS485Communication("COM3"); // 选择正确的COM端口
comm.Open();
comm.SendData("Hello RS-485");
comm.ReceiveData();
// 应用程序运行时,将持续接收数据
// 当不再需要接收数据时,关闭端口
comm.Close();


http://www.kler.cn/a/298883.html

相关文章:

  • SSD目标检测算法
  • ubuntu 24.04-无域名创建本机和局域网和同网段局域网机器可访问的https网页服务
  • D102【python 接口自动化学习】- pytest进阶之fixture用法
  • Gaea学习笔记总结
  • LightGBM分类算法在医疗数据挖掘中的深度探索与应用创新(上)
  • unity webgl部署到iis报错
  • Hive SQL查询汇总分析
  • HumanNeRF:Free-viewpoint Rendering of Moving People from Monocular Video 翻译
  • Excel怎样计算梯度费用,就拿电费来举例计算
  • Druid连接池
  • docker 重启容器且修改服务映射端口
  • python科学计算:NumPy 文件操作与数据读写
  • 【docker】Docker容器文件操作指南:从查看到传输
  • vue3 eltable 数据向上移动/向下移动
  • 在 JavaScript 中,=== 和 ==的区别
  • Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术
  • gdb中使用python脚本
  • 合宙4G模组Air780EX——产品规格书
  • 通信工程学习:什么是FMC固定移动融合
  • Anthropic 的 Claude AI 如何可能超过 OpenAI 的 ChatGPT?
  • [网络编程]通过java用TCP实现网络编程
  • 景联文科技:专业数据标注公司,推动AI技术革新
  • 【Android】ViewPager基本用法总结
  • 不同工况下的迁移轴承故障诊断,融合SE注意力机制的Resnet18迁移学习,附MATLAB代码...
  • LeetCode53. 最大子数组和(2024秋季每日一题 15)
  • 基于UDP的简易网络通信程序