通信协议是数字电子和嵌入式系统的组成部分。无论何时存在多个微控制器和外围设备的接口,都必须使用通信协议来交换数据束。有许多类型的串行通信协议可用。RS485是串行通信协议之一,用于工业项目和重型机械中。
在上一教程中,我们了解了Arduino Uno和Arduino Nano之间的RS485串行通信。本教程是关于在STM32F103C8微控制器中使用RS-485串行通信的。如果您是STM32微控制器的新手,请使用Arduino IDE从STM32入门入手:闪烁LED并在此处检查所有STM32项目。
在本教程中,主STM32F103C8具有三个按钮,用于通过使用RS-485串行通信来控制从Arduino Uno上存在的三个LED的状态。
让我们从了解RS-485串行通信的工作开始。
RS-485串行通讯
RS-485是一种异步串行通信协议,不需要时钟。它使用一种称为差分信号的技术将二进制数据从一个设备传输到另一个设备。
那么,这种差分信号传输方法是什么呢?
差分信号方法通过使用正负5V产生差分电压来工作。它提供了一个半双工使用时通信两根导线和全双工使用时的通信4米 的电线。
通过使用此方法:
- RS-485支持最高30Mbps的更高数据传输速率。
- 与RS-232协议相比,它还提供了最大的数据传输距离。它最多可传输1200米的数据。
- 与RS-232相比,RS-485的主要优点是具有单个主设备的多个从设备,而RS-232仅支持单个从设备。
- 最多可以将32个设备连接到RS-485协议。
- RS-485的另一个优点是不受噪声影响,因为它们使用差分信号方法进行传输。
- 与I2C协议相比,RS-485速度更快。
RS-485模块可以连接到任何具有串行端口的微控制器。为了将RS-485模块与微控制器一起使用,需要一个基于Maxim MAX485 IC的5V MAX485 TTL至RS485的模块,因为它允许在1200米的远距离上进行串行通信,并且是双向的,半双工的数据传输速率为2.5 Mbps。该模块需要5V的电压。
RS-485引脚说明:
引脚名称 |
描述 |
VCC |
5伏 |
一种 |
同相接收器输入 同相驱动器输出 |
乙 |
反相接收器输入 反相驱动器输出 |
地线 |
地(0V) |
00 |
接收器输出(RX引脚) |
回覆 |
接收器输出(低使能) |
德 |
驱动器输出(高启用) |
DI |
驱动器输入(TX引脚) |
RS485模块具有以下功能:
- 工作电压:5V
- 板载MAX485芯片
- RS485通信的低功耗
- 摆率受限收发器
- 5.08mm间距2P端子
- 便捷的RS-485通讯接线
- 芯片的所有引脚都可以通过微控制器进行控制
- 板子尺寸:44 x 14mm
将此模块与STM32F103C8和Arduino UNO一起使用非常容易。使用微控制器的硬件串行端口。STM32和arduino UNO中的硬件串行引脚如下所示。
- 在STM32F103C8中:引脚PA9(TX)和PA10(RX)
- 在Arduino Uno中:针0(RX)和1(TX)
编程也简单只使用Serial.print()写入到RS-485和Serial.Read()从RS-485和销读取DE&RE的RS-485是由低到接收数据和由高到将数据写入RS-485总线。
所需组件
- STM32F103C8
- Arduino UNO
- MAX485 TTL转RS485转换器模块-(2)
- 10K电位器
- 按钮-3
- LED灯-3
- 电阻器
- 面包板
- 连接线
电路原理图
在本教程中,STM32F103C8用作一个RS-485模块的主机,而Arduino UNO用作另一个RS-485模块的从机。
RS-485和STM32F103C8(Master)之间的电路连接:
RS-485 |
STM32F103C8 |
DI |
PA9(TX1) |
德 回覆 |
PA3 |
00 |
PA10(RX1) |
VCC |
5伏 |
地线 |
地线 |
一种 |
到从站RS-485的A |
乙 |
到从站B-RS-485 |
带有三个按钮的STM32F103C8:
带有三个10k下拉电阻的三个按钮连接到STM32F103C8的引脚PA0,PA1,PA2。
RS-485与Arduino UNO(从站)之间的电路连接:
RS-485 |
Arduino UNO |
DI |
1(TX) |
德 回覆 |
2 |
00 |
0(接收) |
VCC |
5伏 |
地线 |
地线 |
一种 |
至主RS-485 |
乙 |
到主站RS-485的B |
使用三个LED,其中电阻为330欧姆的LED的阳极连接到Arduino UNO的引脚4、7、8,LED的阴极连接到GND。
编程STM32F103C8和Arduino UNO进行RS485串行通信
Arduino IDE用于STM32和Arduino UNO这两块板的开发和编程。但是,请确保已从“工具”->“端口和板”中从“工具”->“板”中选择了相应的端口。如果您发现任何困难或疑问,请参考在ARDUINO IDE中对STM32进行编程。本教程的编程包括两部分,第一部分为STM32F103C8(主机),另一部分为Arduino UNO(从机)。两种代码将在下面一一说明。
STM32F103C8作为主设备在主机侧,读取按钮的状态,然后通过STM32F103C8的硬件串行端口1(PA9,PA10)将这些值串行写入RS-485总线。到目前为止,也不需要外部库。Arduino具有用于串行通信的所有必需库。
开始使用硬件串行引脚(PA9,PA10)以9600的波特率进行串行通信。
Serial1.begin(9600);
在STM32F103C8的引脚PA0,PA1,PA2上读取按钮的状态,并将其存储在变量button1val,button2val,button3val中。如果按下按钮,则值为HIGH;如果未按下,则值为LOW。
int button1val = digitalRead(button1); int button2val = digitalRead(button2); int button3val = digitalRead(button3);
在将按钮值发送到串行端口之前,RS-485的DE和RE引脚应为HIGH,该引脚已连接到STM32F103C8的PA3引脚(使PA3变为高电平):
digitalWrite(enablePin,HIGH);
接下来,将这些值放入串行端口并根据按下的按钮发送值,使用if语句,并在按下按钮时发送相应的值。
如果按下第一个按钮,则条件匹配,并且值“ 1”发送到连接Arduino UNO的串行端口。
如果(button1val == HIGH) { int num1 = 1; Serial1.println(num1); }
同样,按下按钮2时,值2通过串行端口发送,按下按钮3时,值3通过串行端口发送。
否则if(button2val == HIGH) { int num2 = 2; Serial1.println(num2); } else if(button3val == HIGH) { int num3 = 3; Serial1.println(num3); }
当没有按钮被按下时,值0将发送到Arduino Uno。
否则 { int num = 0; Serial1.println(num); }
编程完成,将STM32配置为Master。
Arduino UNO作为奴隶在从设备侧,Arduino UNO接收从STM32F103C8主设备发送的整数值,该值可从连接RS-485模块的Arduino UNO的硬件串行端口(P0,1)获得。
只需读取值并将其存储在变量中即可。根据接收到的值,连接到Arduino GPIO的相应LED点亮或熄灭。
要从主机接收值,只需将RS-485模块的DE和RE引脚设为LOW即可。因此,将Arduino UNO的pin-2(enablePin)设为LOW。
digitalWrite(enablePin,LOW);
现在,只需读取串行端口上可用的整数数据并将其存储在变量中即可。
int接收= Serial.parseInt();
根据接收到的值(即(0、1、2、3)),三个LED之一相应地点亮。
if(receive == 1)//根据接收到的值,相应的LED点亮或熄灭 { digitalWrite(ledpin1,HIGH); } else if(receive == 2) { digitalWrite(ledpin2,HIGH); } else if(receive == 3) { digitalWrite(ledpin3,HIGH); } else { digitalWrite(ledpin1,LOW); digitalWrite(ledpin2,LOW); digitalWrite(ledpin3,LOW); }
这样就完成了将Arduino UNO编程和配置为Slave的工作。同样,这也完成了Arduino UNO和STM32的完整配置。本教程末尾附有工作视频和所有代码。
测试STM32F103C8与Arduino UNO之间的RS485通信:
1.当按下连接到Master STM32的按钮1时,LED 1打开,连接到从Arduino。
2.当按下连接到Master STM32的按钮2时,LED 2打开,连接到从Arduino。
3.同样,当按下按钮3时,LED 3点亮,连接到从Arduino。
这样就完成了STM32F103C8与Arduino UNO之间的RS485串行通信。Arduino UNO和STM32开发板是用于快速原型开发的广泛使用的开发板,我们在这些开发板上完成了许多有用的项目。如果您有任何疑问或建议,请在下面写下并发表评论。