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函数代码描述
int main(void)
{
/* 初始化系统时钟 */
system_clock_config();
/* 初始化中断优先级分组 */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
/* 初始化延时函数 */
delay_init();
/* 初始化LCD */
lcd_init(LCD_DISPLAY_VERTICAL);
/* 初始化RS485 */
rs485_init();
/* 显示信息 */
lcd_string_show(10, 20, 200, 24, 24, (uint8_t *)"RS485 Test");
lcd_string_show(10, 60, 200, 24, 24, (uint8_t *)"RX data:");
while(1)
{
/* 接收到数据 */
if(rs485_rx_number)
{
/* 将末尾字节清零方便显示 */
rx_buf[rs485_rx_number] = 0;
/* 复制数据到 rx_buf */
rs485_data_receive(rx_buf, rs485_rx_number);
/* 清空显示区域 */
lcd_fill(10, 100, 310, 124, WHITE);
/* 显示接收的数据 */
lcd_string_show(10, 100, 200, 24, 24, rx_buf);
/* 发送数据 */
rs485_data_send(tx_buf, 17);
}
}
}
void rs485_init(void)函数代码描述
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] initializes rs485.
* @param none
* @retval none
*/
void rs485_init(void)
void rs485_data_send(uint8_t* pdata, uint16_t num)函数代码描述
/**
* @brief send data.
* @param pdata: data buffer.
* @param num: data size.
* @retval none.
*/
void rs485_data_send(uint8_t* pdata, uint16_t num)
void rs485_data_receive(uint8_t* pdata, uint16_t num)函数代码描述
/**
* @brief receive data.
* @param pdata: data buffer.
* @param num: data size.
* @retval none.
*/
void rs485_data_receive(uint8_t* pdata, uint16_t num)
下载验证
PC端通过串口助手发送“Artery 2022”到SUFR板。
当接收到数据后,在LCD屏上显示接收到的数据。
然后SUFR板再发送一帧数据“AT32-SUFR-BOARD”到PC。
图24. PC端串口助手
|