[应用相关] RS485通信--AT_SURF案例No.10

[复制链接]
 楼主| vt2017 发表于 2022-8-16 19:46 | 显示全部楼层 |阅读模式

RS485通信--AT_SURF案例No.10

简介
RS485通常采用两线制总线,为半双工通讯,常用于工业控制,理论上最大传输距离可达到1200米。总线上可以连接多个设备,在使用时只需要将设备的A口和B口分别连接总线的A线和B线即可。由于RS485信号是差分信号,所以具有较强的抗干扰能力。总线上通常使用主从通讯方式即1个主机带多个从机。
AT32 SUFR板载了一颗485芯片,MCU通过串口连接到该芯片,在发送数据时,MCU将数据通过串口发送到485芯片,485芯片将数据转换成差分信号传输到总线上。在接收时,485芯片将总线上的差分信号数据发送到串口,MCU通过串口读取数据。
图22. 测试流程
5031462fb82b8be3c1.png
资源准备
硬件环境:
对应产品型号的AT-SURF-F437 Board
软件环境:
AT32F435_437_Firmware_Library_V2.x.x\project\at_sufr_f437\examples\rs485
硬件设计
本案例使用的硬件资源有485芯片,对应的引脚如下:
表11. 硬件资源使用
5406962fb82ca93329.png
对应的电路原理如下:
图23. 485电路原理图
8399162fb82d24f356.png
软件设计
RS485测试
初始化RS485
进入接收模式,等待接收数据
PC端发送数据到SUFR板
当SUFR板接收到数据后,在LCD屏上显示接收到的数据
然后再发送一帧数据到总线,然后再进入接收模式,重复上述逻辑
代码介绍
main函数代码描述

  1. int main(void)
  2. {
  3.   /* 初始化系统时钟 */
  4.   system_clock_config();
  5.   
  6.   /* 初始化中断优先级分组 */   
  7.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);

  8.   /* 初始化延时函数 */
  9.   delay_init();
  10.   
  11.   /* 初始化LCD */
  12.   lcd_init(LCD_DISPLAY_VERTICAL);
  13.   
  14.   /* 初始化RS485 */
  15.   rs485_init();
  16.       
  17.   /* 显示信息 */  
  18.   lcd_string_show(10, 20, 200, 24, 24, (uint8_t *)"RS485 Test");
  19.   
  20.   lcd_string_show(10, 60, 200, 24, 24, (uint8_t *)"RX data:");
  21.   
  22.   while(1)
  23.   {
  24.     /* 接收到数据 */
  25.     if(rs485_rx_number)
  26.     {
  27.       /* 将末尾字节清零方便显示 */
  28.       rx_buf[rs485_rx_number] = 0;
  29.       
  30.       /* 复制数据到 rx_buf */
  31.       rs485_data_receive(rx_buf, rs485_rx_number);

  32.       /* 清空显示区域 */
  33.       lcd_fill(10, 100, 310, 124, WHITE);  
  34.       
  35.       /* 显示接收的数据 */
  36.       lcd_string_show(10, 100, 200, 24, 24, rx_buf);
  37.       
  38.       /* 发送数据 */
  39.       rs485_data_send(tx_buf, 17);
  40.     }
  41.   }
  42. }
void rs485_init(void)函数代码描述
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  initializes rs485.
  3.   * @param  none
  4.   * @retval none
  5.   */
  6. void rs485_init(void)
void rs485_data_send(uint8_t* pdata, uint16_t num)函数代码描述
  1. /**
  2.   * @brief  send data.
  3.   * @param  pdata: data buffer.
  4.   * @param  num: data size.
  5.   * @retval none.
  6.   */
  7. void rs485_data_send(uint8_t* pdata, uint16_t num)
void rs485_data_receive(uint8_t* pdata, uint16_t num)函数代码描述
  1. /**
  2.   * @brief  receive data.
  3.   * @param  pdata: data buffer.
  4.   * @param  num: data size.
  5.   * @retval none.
  6.   */
  7. void rs485_data_receive(uint8_t* pdata, uint16_t num)
下载验证
PC端通过串口助手发送“Artery 2022”到SUFR板。
当接收到数据后,在LCD屏上显示接收到的数据。
然后SUFR板再发送一帧数据“AT32-SUFR-BOARD”到PC。

图24. PC端串口助手

1862462fb82dba7703.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

69

帖子

3

粉丝
快速回复 返回顶部 返回列表