锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C#开源 / C#算法开源英语 / C#跨平台RS485通信经典例子含硬件设计开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。

C#跨平台RS485通信经典例子含硬件设计开发


背景

最近电厂的项目用到RS485通信,抱着学习的态度,找一些文章看看,发现国外网站上有标题对应的文章,刚好有个客户也咨询关于嵌入式系统开发要求,也要和嵌入式系统通信,就翻译下自己学学,也供大家参考。知识权利归外文网站xanthium,URL:https://www.xanthium.in/crossplatform-rs485-communication-using-csharp-dotnet-framework-mono。

粗看了下,硬件引脚讲解详细,C#参数和引脚关系表达清楚,C#代码比较简单,mono进行跨平台编译运行有一定篇幅。

看不懂英文网站,找锐英源。

 

 

在本教程中,我们将学习在 x86 PC 和微控制器板之间构建和编程RS485 通信网络。PC 端软件是用CSharp (C#)编写的,旨在在 Linux 和 Windows 操作系统上运行。

Windows平台上,该软件在.NET Framework上运行,在Linux平台上,它在名为Mono Framework的开源等效程序上运行。

该软件可用作通过 RS485 链路从 PC 控制 PLC或开发 SCADA 软件的起点。

本教程要求读者熟悉使用 C# 编程语言在 Windows 或 Linux 系统上对串口进行编程。

建议阅读

使用 C# (dotnet)在 Windows 上进行串行端口编程

或 使用 C# (单声道)在 Linux 上进行串行端口编程。

 

链接到 Github 上的 xanthium 企业存储库,其中包含使用 CSharp 进行 RS485 通信的代码 

本教程中使用的所有 CSharp (C#) 源文件都可以 从我们的 GitHub Page 下载

 

电路原理图

在这里,我们将通过 RS485 链路将微控制器板与运行 Windows 或 Linux 操作系统的 x86 PC 连接。在微控制器端,我们使用连接到 MAX485 RS485 解码器芯片的 MSP430 Launchpad。在 PC 端,我们使用USB2SERIAL USB 到RS485转换器将PC发送的数据转换为RS485兼容的信号电平。下图显示了MSP430和PC之间的连接。

使用 USB2SERIAL USB 到 RS485 转换器通过 RS485 协议将微控制器与 windows/Linux PC 连接

使用 RS485 协议与 PC 连接的 MSP430 Launchpad

这是将 MAX485 RS485 收发器芯片 与 MSP430 Launchpad (MSP430G2553) 连接的详细说明。请注意,您可以使用任何微控制器,如 8051、LPC2148 (ARM7、NXP) 或 ATmega8535 (Atmel) 代替 MSP430。如果您是 MSP430 的新手,您可以查看 有关使用 MSP430 Launchpad 的简要教程。还有有关配置 MSP430G2553 UART的详细说明 。

如果您使用的是MSP430 Motor control Booster Pack(上图),您可以使用内置的 MAX485 通信模块进行 RS485 通信,如下图所示。下图显示了如何将 Booster Pack 与 USB2SERIAL 连接。

使用 RS485 协议将 MSP430 电机控制 Booster Pack 与 Windows/Linux PC 连接

硬件

大多数 PC 没有内置 RS485 通信端口,因此为了使您的 PC 与 RS485 网络进行通信,您需要一个USB 到 RS485 转换器

在本教程中,我使用基于 FT232 的USB 到 RS485/RS232/串行转换器,称为 USB2SERIAL

USB2SERIAL 使用 FT232 和 MAX 485 芯片将 USB 协议从您的 PC 转换为 RS485 信号电平。该板还可用于与 Legacy RS232 设备进行通信。

在 ebay 上在线提供 USB 到 RS485 转换器

USB2SERIAL可在线购买。用户手册可 在此处找到

USB2SERIAL RS485 部分

对USB2SERIAL的 RS485 端口进行编程类似于对串行端口进行编程。在 RS485 编程中,步骤与串行编程类似,这里我们将使用 RTS 和 DTR 引脚来控制数据传输(发送/接收)的方向。

下图显示了 USB2SERIAL(USB 转 RS485 转换器)的 RS485 部分。

RS485部分USB2SERIAL USB转RS485转换器

将 CONN1 跳线(红色方块)移向 RS485 一侧,将FT232 的 TXD 连接到 MAX485 的 DI 引脚(红线),将FT232 的 RXD 连接到 MAX485 的 RO 引脚(绿线)。从 PC 发送的数据将发送到MAX485的DI引脚,然后通过RS485链路传输。MAX485通过RS485链路接收的数据通过FT232的RXD引脚发送回PC。

FT232 的~DTR 和~RTS 引脚(均为低电平有效)通过CONN2 跳线连接到MAX485 的DE 和~RE(低电平有效)引脚。FT232 的~DTR 引脚用于将MAX485 置于发送模式,而~RTS 引脚用于将MAX485 芯片置于接收模式

当您使用USB2SERIAL USB 转 RS485 转换器时,应通过选择跳线将板置于RS485 模式,如下图所示。

在 USB2SERIAL V2.0 USB 转 RS485 转换器中设置 RS485 模式

配置 RS485 模式的跳线设置后,

FT232的TXD 输出(TTL)连接到MAX485的DI管脚。(通过 CONN1 跳线) FT232的
RXD 输入(TTL)连接到MAX485的RO管脚。(通过 CONN1 跳线)

FT232 的~RTS(低电平有效) 引脚连接到MAX485 的 ~RE(低电平有效) 引脚(通过 CONN2 跳线)。
FT232 的~DTR(低电平有效) 引脚连接到  MAX485 的DE 引脚(通过 CONN2 跳线)。 

使用 USB 到 RS485 转换器将 x86 PC 与 RS485 网络连接

C#中的RS485通信代码

现在让我们编写PC端代码与RS485网络通信。RS485端口的编程基本上是串行编程+ RTS/DTR引脚控制,RS485端口编程的基本步骤概述如下。

1) 识别 USB2SERIAL 的 COM 端口号
2) 打开串口
3) 设置波特率、开始/停止位等参数
4) 将 USB2SERIAL 板置于发送或接收模式
5) 发送数据或等待数据接收 
6) 关闭串行端口

对 RS485 端口进行编程的第一步是识别与 USB2SERIAL 板对应的端口号。如果您想知道为什么我们在讨论 RS485 通信时要讨论串行端口号,这是因为 USB2SERIAL 对操作系统(Windows /Linux)来说是一个虚拟串行端口。数据首先发送到虚拟串行端口,然后进入MAX485 RS485转换器。

在 Windows 上,这可以通过检查设备管理器找到。在 Linux 上,您可以检查 /dev 目录。我已经写了一篇关于在 Linux 上查找串行端口号的详细文章。

由于打开串口并设置波特率,开始/停止位的数量已经在使用 C# 的串口编程教程中进行了说明,这里不再赘述。您可以在此处 (Windows)和此处查看(Linux)。  

通过 RS485 链路传输一个字节

USB2SERIAL中FT232芯片的~RTS和~DTR引脚通过CONN2连接到MAX485芯片的RE和DE引脚,这两个引脚( FT232的~RTS和~DTR)用于控制RS485链路中的传输方向.请注意,MAX 485是半双工RS485收发器,这意味着它一次只能发送或接收,不能同时发送和接收。

现在要记住的一件事是来自 FT232 芯片的 RTS 和 DTR 信号 低电平有效 。

当您  使用 C# API将 RTS 引脚设置为高电平时,来自 FT232 的 ~RTS 线将变为低电平 (对于 ~DTR 相同)。

当您  使用 C# API清除 RTS 引脚时, ~RTS 线将变为高电平

将 MAX485 置于发送模式

MAX485可以通过将 DE引脚保持高电平 和~RE引脚保持低电平来进入传输模式。正如我 已经提到的~RTS连接到 MAX485的~RE引脚,  ~DTR引脚连接到DE。 

要将芯片置于发送模式,

使用COMPort.DtrEnable = false清除 DTR 引脚;这样 FT232 的~DTR 引脚为高电平 ,使 MAX485 的 DE 引脚(发送模式)。 使用 COMPort.RtsEnable = false清除 RTS 引脚;,因此 FT232的~RTS引脚为高电平, 禁用MAX485的~RE引脚(接收模式被禁用)。  

 现在在 USB2SERIAL 板上DB9 Male 连接器附近有 4 个 LED 灯,用于指示 MAX485 的 DI、DE、~RE (低电平有效) 和 RO 引脚的状态。

USB2SERIAL 的 4 个 LED 指示灯,用于在 USB 到 RS485 转换期间显示 MAX485 的状态

当您将 USB2SERIAL 板连接到 PC 时(跳线设置为 RS485 模式), 除 RO 之外的所有 LED 都将亮起。

当打开与串行端口的连接时,  DE 和 ~RE LED 将熄灭 ,而其他两个(RO 和 DI)将亮起。现在,当您 清除 DTR 引脚时 ,您可以看到 DE LED 亮起 并清除 RTS您可以看到~RE LED 亮起。这使得检查您的 RTS 和 DTR 控制代码是否正常工作变得非常容易。

请注意,如果您运行本教程提供的代码,您将无法看到灯光变化,因为它发生得非常快。检查这一点的一种方法是在代码中放置断点。 

RS485传输代码

现在这里是一个通过 RS485 网络传输一个字节(字符'A')的框架代码。

using System;
using System.IO.Ports;

namespace USB2SERIAL_RS485_Write
{
 class RS485Write
{
static void Main(string[] args)
{
SerialPort COMPort = new SerialPort() ; //创建一个串口对象

     COMPort.PortName = " COM24 ";      // 分配 COM 端口号
COMPort.BaudRate = 9600 ;         // 设置波特率 = 9600
COMPort.DataBits = 8 ;            // 数据位数 = 8
COMPort.Parity   = Parity.None ;  // 无奇偶校验
COMPort.StopBits = StopBits.One ; // 一位停止位

COMPort.Open();                  // 打开串口
//将 USB2SERIAL 置于传输模式 
COMPort.DtrEnable = false ;       // 因为 DTR = 0.~DTR = 1 所以 DE = 1 
COMPort.RtsEnable = false ;       // 因为 RTS = 0,~RTS = 1 所以~RE = 1

     COMPort.Write("A");              // 将“A”写入打开的串口

     COMPort.Close() ;                 // 关闭串口
}
}
}

请提供您系统对应的串口名称,

在 Windows 上,(这里 COM24 是我系统中的端口号) 

COMPort.PortName  = " COM24 ";      //分配COM端口号

在 Linux 上,(这里 ttyUSB0 是我系统中的端口号) 

COMPort.PortName  = " /dev/ttyUSB0 "; //分配COM端口号

您可以使用Visual StudioSharpDevelopMono Compiler (Linux) 编译代码。请注意,在 Linux 上,您应该以 root 用户身份运行程序。

通过 RS485 Link 接收字符串

要接收字符串,我们将 USB2SERIAL 置于接收模式并等待另一端的微控制器发送字符串。然后我们将使用 ReadLine() 函数读取数据并在控制台上显示。

将 MAX485 置于接收模式

MAX485 可以通过 保持~RE 引脚为低电平 和DE 引脚为低电平进入接收模式。(~RTS 连接到MAX485 的~RE 引脚,~DTR 引脚连接到DE)。

要将芯片置于 接收模式

设置 RTS 引脚,使 FT232 的~RTS 引脚为高电平 ,使 MAX485 的~RE 引脚处于 启用状态(启用接收模式)。我们设置 RTS 引脚的原因是因为 RTS 引脚在 FT232 芯片内部倒置。

 将 DTR引脚 设置为~DTR 引脚为低电平 ,这将禁用 DE 并禁止 MAX485 的发送模式。

将板置于接收模式后, USB2SERIAL 板上的~RE 和 DE  LED 将熄灭。

RS485 接收代码

下面是一个通过 RS485 网络接收字符串的框架代码。字符串“ Hello from MSP430 \n ”由连接到 RS485 网络的微控制器发送。 

using System;
using System.IO.Ports;//namespace containing SerialPort class

namespace USB2SERIAL_RS485_Read
{
class RS485_Read


{
static void Main(string[] args)
{
string RxedData; // 保持接收数据的变量
SerialPort COMPort = new SerialPort(); //创建一个串口对象 

     COMPort.PortName = "COM24";       // 分配 COM 端口号
COMPort.BaudRate = 9600 ;          // 设置波特率 = 9600
COMPort.DataBits = 8 ;             // 数据位数 = 8
COMPort.Parity = Parity.None ;   // 无奇偶校验
COMPort.StopBits = StopBits.One ;  // 一个停止位

     COMPort.Open();                   // 打开串口
//将 USB2SERIAL 置于接收模式       
COMPort.RtsEnable = true ;         // 因为 RTS = 1, ~RTS = 0 所以 ~RE = 0 
COMPort.DtrEnable = true ;        // 因为 DTR = 1. ~DTR = 0 所以 DE = 0 

RxedData = COMPort.ReadLine() ;       // 等待数据接收
Console.WriteLine("\n\t \" {0} \" ", RxedData) ; 
}
}
}

运行代码 

在 Windows 上,您可以使用 Microsoft Visual Studio 或 Sharpdevelop IDE 编译 .cs 文件。为了在 PC 和微控制器之间进行 RS485 通信,请按照上图所示进行电路连接。如果您使用的是 RobotShield Booster Pack,则无需构建 MAX485 接口电路,因为它内置在 Booster Pack 本身中。 

对于通过 RS485 链接从 PC 向微控制器发送数据,将 MSP430 接收程序下载到 MSP430 微控制器上,然后使用 Visual Studio 或 Sharpdevelop IDE 编译并运行 RS485_Write_Win32.cs 文件。截图如下。

使用 C sharp 和 Dot net 框架在 PC 和微控制器之间进行跨平台 RS485 通信

对于通过 RS485 链路接收从微控制器发送到 PC 的数据 ,将 MSP430 传输程序下载到 MSP430 微控制器上,然后 使用 Visual Studio 或 Sharpdevelop IDE 编译并运行 RS485_Read_Win32.cs 文件。重置微控制器,使其发送字符串“Hello从 MSP430 \n" 到 PC 。截图如下。

使用 C sharp 和 Dot net 框架在 PC 和微控制器之间进行跨平台 RS485 通信

在 Linux 上,.cs 文件可以使用 Mono C Sharp 编译器 (mcs) 编译并使用 Mono Runtime 运行。请注意,该程序需要 root 权限才能运行。有关在 Linux 上编译 C# 文件的更多详细信息,您可以查看这篇文章

您可以使用 mcs 编译器编译 c# 文件,如下所示。

在 Linux 上编译 RS485 通讯程序

如果程序编译正确,它将生成一个同名的 exe 文件。然后您可以使用 mono runtime 运行该 exe 文件,如下所示。

在 Linux 上运行 RS485 通信程序

下面的两个截图显示了程序在 Linux 系统上对 RS485 端口的读写。

Linux上PC和微控制器之间的跨平台RS485通信

Linux 系统上的 RS485 编程

 

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内劳动服务器公司办公楼一层