硬汉嵌入式论坛

 找回密码
 立即注册
查看: 540|回复: 0
收起左侧

[网络转载] RS485通信--AT_SURF案例No.10

[复制链接]

29

主题

5

回帖

92

积分

初级会员

积分
92
发表于 2022-8-16 19:46:44 | 显示全部楼层 |阅读模式
RS485通信--AT_SURF案例No.10

简介
RS485通常采用两线制总线,为半双工通讯,常用于工业控制,理论上最大传输距离可达到1200米。总线上可以连接多个设备,在使用时只需要将设备的A口和B口分别连接总线的A线和B线即可。由于RS485信号是差分信号,所以具有较强的抗干扰能力。总线上通常使用主从通讯方式即1个主机带多个从机。
AT32 SUFR板载了一颗485芯片,MCU通过串口连接到该芯片,在发送数据时,MCU将数据通过串口发送到485芯片,485芯片将数据转换成差分信号传输到总线上。在接收时,485芯片将总线上的差分信号数据发送到串口,MCU通过串口读取数据。
图22. 测试流程

资源准备
硬件环境:
对应产品型号的AT-SURF-F437 Board
软件环境:
AT32F435_437_Firmware_Library_V2.x.x\project\at_sufr_f437\examples\rs485
硬件设计
本案例使用的硬件资源有485芯片,对应的引脚如下:
表11. 硬件资源使用

对应的电路原理如下:
图23. 485电路原理图

软件设计
RS485测试
初始化RS485
进入接收模式,等待接收数据
PC端发送数据到SUFR板
当SUFR板接收到数据后,在LCD屏上显示接收到的数据
然后再发送一帧数据到总线,然后再进入接收模式,重复上述逻辑
代码介绍
main函数代码描述

  1. int main(void)
  2. {
  3. /* 初始化系统时钟 */
  4. system_clock_config();

  5. /* 初始化中断优先级分组 */
  6. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);

  7. /* 初始化延时函数 */
  8. delay_init();

  9. /* 初始化LCD */
  10. lcd_init(LCD_DISPLAY_VERTICAL);

  11. /* 初始化RS485 */
  12. rs485_init();

  13. /* 显示信息 */
  14. lcd_string_show(10, 20, 200, 24, 24, (uint8_t *)"RS485 Test");

  15. lcd_string_show(10, 60, 200, 24, 24, (uint8_t *)"RX data:");

  16. while(1)
  17. {
  18. /* 接收到数据 */
  19. if(rs485_rx_number)
  20. {
  21. /* 将末尾字节清零方便显示 */
  22. rx_buf[rs485_rx_number] = 0;

  23. /* 复制数据到 rx_buf */
  24. rs485_data_receive(rx_buf, rs485_rx_number);

  25. /* 清空显示区域 */
  26. lcd_fill(10, 100, 310, 124, WHITE);

  27. /* 显示接收的数据 */
  28. lcd_string_show(10, 100, 200, 24, 24, rx_buf);

  29. /* 发送数据 */
  30. rs485_data_send(tx_buf, 17);
  31. }
  32. }
  33. }
复制代码
void rs485_init(void)函数代码描述

  1. /**
  2. * @brief 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端串口助手



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 17:35 , Processed in 0.163936 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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