精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。
最近电厂的项目用到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 上进行串行端口编程。
本教程中使用的所有 CSharp (C#) 源文件都可以 从我们的 GitHub Page 下载。
电路原理图
在这里,我们将通过 RS485 链路将微控制器板与运行 Windows 或 Linux 操作系统的 x86 PC 连接。在微控制器端,我们使用连接到 MAX485 RS485 解码器芯片的 MSP430 Launchpad。在 PC 端,我们使用USB2SERIAL USB 到RS485转换器将PC发送的数据转换为RS485兼容的信号电平。下图显示了MSP430和PC之间的连接。
这是将 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 连接。
硬件
大多数 PC 没有内置 RS485 通信端口,因此为了使您的 PC 与 RS485 网络进行通信,您需要一个USB 到 RS485 转换器。
在本教程中,我使用基于 FT232 的USB 到 RS485/RS232/串行转换器,称为 USB2SERIAL。
USB2SERIAL 使用 FT232 和 MAX 485 芯片将 USB 协议从您的 PC 转换为 RS485 信号电平。该板还可用于与 Legacy RS232 设备进行通信。
USB2SERIAL可在线购买。用户手册可 在此处找到。
USB2SERIAL RS485 部分
对USB2SERIAL的 RS485 端口进行编程类似于对串行端口进行编程。在 RS485 编程中,步骤与串行编程类似,这里我们将使用 RTS 和 DTR 引脚来控制数据传输(发送/接收)的方向。
下图显示了 USB2SERIAL(USB 转 RS485 转换器)的 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 模式,如下图所示。
配置 RS485 模式的跳线设置后,
FT232的TXD 输出(TTL)连接到MAX485的DI管脚。(通过 CONN1 跳线) FT232的
RXD 输入(TTL)连接到MAX485的RO管脚。(通过 CONN1 跳线)
FT232 的~RTS(低电平有效) 引脚连接到MAX485 的 ~RE(低电平有效) 引脚(通过 CONN2 跳线)。
FT232 的~DTR(低电平有效) 引脚连接到 MAX485 的DE 引脚(通过 CONN2 跳线)。
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 板连接到 PC 时(跳线设置为 RS485 模式), 除 RO 之外的所有 LED 都将亮起。
当打开与串行端口的连接时, DE 和 ~RE LED 将熄灭 ,而其他两个(RO 和 DI)将亮起。现在,当您 清除 DTR 引脚时 ,您可以看到 DE LED 亮起 并清除 RTS您可以看到~RE LED 亮起。这使得检查您的 RTS 和 DTR 控制代码是否正常工作变得非常容易。
请注意,如果您运行本教程提供的代码,您将无法看到灯光变化,因为它发生得非常快。检查这一点的一种方法是在代码中放置断点。
RS485传输代码
现在这里是一个通过 RS485 网络传输一个字节(字符'A')的框架代码。
using System; namespace USB2SERIAL_RS485_Write COMPort.PortName = " COM24 "; // 分配 COM 端口号 COMPort.Write("A"); // 将“A”写入打开的串口 COMPort.Close() ; // 关闭串口 |
请提供您系统对应的串口名称,
在 Windows 上,(这里 COM24 是我系统中的端口号)
COMPort.PortName = " COM24 "; //分配COM端口号
在 Linux 上,(这里 ttyUSB0 是我系统中的端口号)
COMPort.PortName = " /dev/ttyUSB0 "; //分配COM端口号
您可以使用Visual Studio、SharpDevelop或Mono 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; namespace USB2SERIAL_RS485_Read
COMPort.PortName = "COM24"; // 分配 COM 端口号 COMPort.Open(); // 打开串口 |
运行代码
在 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 文件。截图如下。
对于通过 RS485 链路接收从微控制器发送到 PC 的数据 ,将 MSP430 传输程序下载到 MSP430 微控制器上,然后 使用 Visual Studio 或 Sharpdevelop IDE 编译并运行 RS485_Read_Win32.cs 文件。重置微控制器,使其发送字符串“Hello从 MSP430 \n" 到 PC 。截图如下。
在 Linux 上,.cs 文件可以使用 Mono C Sharp 编译器 (mcs) 编译并使用 Mono Runtime 运行。请注意,该程序需要 root 权限才能运行。有关在 Linux 上编译 C# 文件的更多详细信息,您可以查看这篇文章.
您可以使用 mcs 编译器编译 c# 文件,如下所示。
如果程序编译正确,它将生成一个同名的 exe 文件。然后您可以使用 mono runtime 运行该 exe 文件,如下所示。
下面的两个截图显示了程序在 Linux 系统上对 RS485 端口的读写。