细说STM32F407单片机RS485收发通信实例及调试方法

目录

一、硬件配置

1、RCC、DEBUG、CodeGenerator

2、USART3

3、 RS485_DIR

4、NVIC 

二、软件设计

1、RS485的收发控制

2、main.c

三、运行调试

1、修改RS485_DIR为SET后需要延迟

2、向串口助手发送的数据不能太长


        MCU上的串口UART(USART)是逻辑电平(TTL或CMOS电平),在开发板上实现与串口助手之间的RS485通信,就是把单片机上的逻辑电平通过RS485物理层芯片转换为RS485电平。

        本文继续使用旺宝红龙开发板STM32F407ZGT6 KIT V1.0。本文的目的是通过MAX485物理层芯片把开发板上的USART3(PB10、PB11)逻辑电平转换为RS485电平,然后通过一条USB转RS485的转换线连接到串口助手上。原理图如下:

        P18的管脚A+连接USB转RS485的线的T/R+,P18的管脚A-连接USB转RS485的线的T/R-。

        在串口助手上识别出识别出该线的驱动,选择并设置波特率,通过几次调试可以选择到不失真时的最大波特率,其它参数可以默认。串口助手的波特率与MCU里配置USART3时选择的波特率要一致。

一、硬件配置

1、RCC、DEBUG、CodeGenerator

  • RCC:外部晶振25MHz,HCLK=168MHz,PCLK1=42MHz,PCLK2=84MHz;
  • DEBUG:Serial Wire;
  • CodeGenerator:勾选☑Generate peripheral initialization as a pair of '.c/.h' files per peripheral

2、USART3

        配置PB10、PB11为USART3,波特率9600,其它参数默认;

        本文作者测试到波特率14400,不失真,15200失真。

3、 RS485_DIR

        RS485是半双工通信的,因此有方向控制,设置PF7为RS485_DIR,默认为高电平。

4、NVIC 

        把Times base的中断优先级修改为0。USART3的全局中断可以设置为优先级1。如果不需要也可以不选择。

二、软件设计

        实例程序很短,只是为了演示RS485的收发控制。

1、RS485的收发控制

         每次向串口助手发送前,要先把RS485_DIR置位。

  //修改RS485为发送HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET);

        每次接收数据前要先把RS485_DIR复位。

//默认RS485为接收状态
HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_RESET);

2、main.c

/* USER CODE BEGIN Includes */
#include <stdio.h>
uint8_t rxbuf[8];
uint8_t ackbuf[]="123\r\n";
/* USER CODE END Includes */
/* USER CODE BEGIN 2 *///默认RS485为发送状态uint8_t txbuf1[]="Hello,world!\r\n";HAL_UART_Transmit(&huart3,txbuf1,sizeof(txbuf1),1000);HAL_Delay(500);HAL_UART_Transmit(&huart3,txbuf1,sizeof(txbuf1),1000);HAL_Delay(500);uint8_t txbuf2[]="TEST RS485!\r\n";HAL_UART_Transmit(&huart3,txbuf2,sizeof(txbuf2),1000);HAL_Delay(500);HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);HAL_Delay(500);//修改RS485为接收HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_RESET);//485改为接收后,不能发送HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);HAL_Delay(500);//修改RS485为发送HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET);//没有适当的延迟,则乱码HAL_Delay(200);	//切换测试,注释掉,以观察乱码uint8_t txbuf3[]="can transmit again.\r\n";HAL_UART_Transmit(&huart3,txbuf3,sizeof(txbuf3),1000);HAL_Delay(500);HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);HAL_Delay(500);HAL_UART_Transmit(&huart3,txbuf1,sizeof(txbuf1),1000);HAL_Delay(500);//修改为小于16字节后,乱码消失.uint8_t txbuf4[]="transmit again.\r\n";HAL_UART_Transmit(&huart3,txbuf4,sizeof(txbuf4),1000);HAL_Delay(500);/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 *//* 如果MCU接收到数据,则执行发送任务,发送前修改485为发送*/if(HAL_UART_Receive(&huart3,rxbuf,sizeof(rxbuf),1000) == HAL_OK){/*设置485为发送*/HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET);//修改RS485收发控制后要有延迟,否则,立刻发送的数据会有乱码HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);printf("\r\n");HAL_Delay(200);printf("修改RS485_DIR后要有延迟,");printf("否则,立刻发送的数据会有乱码.\r\n");HAL_Delay(500);	//这是必需,否则会乱码HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);HAL_Delay(500);char str[8];sprintf(str,"%s",ackbuf);printf("test:%s\r\n",str);HAL_Delay(500);uint8_t txbuf6[]="RS485发送的数据:";HAL_UART_Transmit(&huart3,txbuf6,sizeof(txbuf6),1000);//printf("RS485发送的数据:");HAL_Delay(500);HAL_UART_Transmit(&huart3,rxbuf,sizeof(rxbuf),1000);HAL_Delay(500);printf("\r\n");HAL_Delay(200);uint8_t txbuf7[]="\r\n";HAL_UART_Transmit(&huart3,txbuf7,sizeof(txbuf7),1000);HAL_Delay(200);}/默认RS485为接收状态HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_RESET);
}
/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
//串口打印
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart3,(uint8_t*)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

三、运行调试

        重要的调试发现,在调试RS485通讯时,发现串口助手上显示乱码,最终找到2个原因:

1、修改RS485_DIR为SET后需要延迟

        每次HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET)后应该适当地延迟,不然,显示到串口助手上的数据乱码。

2、向串口助手发送的数据不能太长

        向串口助手上发送的数据不能太长,不然,也会乱码。具体达到多长的数据才开始乱码,要测试后确定。过长的数据可以分批次传送,printf()函数更适合发送长的数据,也适合发送和显示有换行要求的数据;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF工具 Candy Desktop(安卓)

PDF Candy Desktop&#xff08;安卓&#xff09; 今天给大家分享一个电脑端的PDF工具&#xff0c;里面的功能很多&#xff0c;主要涉及PDF编辑、转换等&#xff0c;不仅超级好用&#xff0c;而且免费&#xff01;剩下就不说了&#xff0c;兄弟们自行下载体验吧&#xff01; 「…

基于javaweb的SSM+Maven幼儿园管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

golang安装(1.23.6)

1&#xff0e;切换到安装目录 cd /usr/local 2&#xff0e;下载安装包 wget https://go.dev/dl/go1.23.6.linux-amd64.tar.gz 3&#xff0e;解压安装包 sudo tar -C /usr/local -xzf go1.23.6.linux-amd64.tar.gz 4&#xff0e;配置环境变量 vi /etc/profile export PATH$…

【新手入门】SQL注入之盲注

一、引言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办? 例如应用程序返回到一个"通用的"的页面&#xff0c;或者重定向一个通用页面(可能为网站首页)。这时&#xff0c;我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无…

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

青少年软件编程(Python)等级考试试卷(六级) ↓↓↓↓↓↓ 真题模拟测试 分数:100 题数:38 一、单选题(共25题,共50分) 下面代码的输出结果正确的是?( )import json json_str =’ [ “Alice”, “girl", 17,“New York”]’ data = json.loads(json_str) prin…

wordpress按不同页调用不同的标题3种形式

在WordPress中&#xff0c;可以通过多种方式根据不同的页面调用不同的标题。这通常用于实现SEO优化、自定义页面标题或根据页面类型显示不同的标题内容。 使用wp_title函数 wp_title函数用于在HTML的title标签中输出页面标题。你可以通过修改主题的header.php文件来实现自定义…

DeepSeek-R1 大模型实战:腾讯云 HAI 平台 3 分钟极速部署指南

引言&#xff1a;为什么选择 DeepSeek-R1&#xff1f; 近期&#xff0c;国产大模型 DeepSeek-R1 因其低成本、高性能的特点在全球 AI 领域引发热议。根据 Sensor Tower 数据&#xff0c;其发布仅 18 天便斩获 1600 万次下载量&#xff0c;远超 ChatGPT 同期表现。而腾讯云推出…

【Pytest】setup和teardown的四个级别

文章目录 1.setup和teardown简介2.模块级别的 setup 和 teardown3.函数级别的 setup 和 teardown4.方法级别的 setup 和 teardown5.类级别的 setup 和 teardown 1.setup和teardown简介 在 pytest 中&#xff0c;setup 和 teardown 用于在测试用例执行前后执行一些准备和清理操…

使用Docker将ros1自定义消息通过rosjava_bootstrap生成jar包

文章目录 预准备环境rosjava_bootstrap坏消息好消息 环境安装docker安装rosjava_bootstrap仓库rosjava_center仓库修改rosjava_bootstrap代码拉取docker镜像放置自己的自定义消息 启动docker编译 预准备环境 rosjava_bootstrap rosjava_bootstrap是将自定义的ROS消息生成java…

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集&#xff1a; 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中&#xff0c;实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送&#xff0c;还是多人协作工具&#xff0c;WebSocket 都是实现高效实时通信的最佳选择之一。本…

轮式机器人在复杂地形中如何选择合适的全局路径规划算法?

已思考完成 收起 嗯&#xff0c;用户问的是轮式机器人在复杂地形中如何选择合适的全局路径规划算法。首先&#xff0c;我需要理解复杂地形可能带来的挑战&#xff0c;比如崎岖的路面、动态障碍物、非结构化环境等等。轮式机器人在这里的运动控制需要考虑地形通过性、稳定性&…

Mysql100道高频面试题

一、基础概念 1. 什么是数据库&#xff1f;DBMS的作用是什么&#xff1f; 数据库&#xff1a;是按照数据结构来组织、存储和管理数据的仓库。它允许用户高效地访问和管理数据。 DBMS&#xff08;数据库管理系统&#xff09;&#xff1a;是一种软件系统&#xff0c;用于创建和…

React底层原理详解

React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次挂载过程详解 在面试中介绍React底层原理时&#xff0c;需遵循逻辑清晰、层次分明、重点突出的原则&#xff0c;结合技术深度与实际应用场景。以下是结构化回答模板&#xff1a;…

qt5的中文乱码问题,QString、QStringLiteral 为 UTF-16 编码

qt5的中文乱码问题一直没有很明确的处理方案。 今天处理进程间通信时&#xff0c;也遇到了qt5乱码问题&#xff0c;一边是设置的GBK&#xff0c;一边设置的是UTF8&#xff0c;单向通信约定采用UTF8。 发送端保证发的是UTF8字符串&#xff0c;因为UTF8在网络数据包中没有字节序…

解锁浏览器内置API,助力跨标签/跨页面数据通信

1 BrodcastChanner 概念 BroadcastChannel接口表示给定源的任何浏览上下文都可以订阅的命名频道。它允许同源的不同浏览器窗口、标签页、frame 或者 iframe 下的不同文档之间相互通信。消息通过message事件进行广播&#xff0c;该事件在侦听该频道的所有BroadcastChannel对象上…

Mysql-如何理解事务?

一、事务是什么东西 有些场景中&#xff0c;某个操作需要多个sql配合完成&#xff1a; 例如&#xff1a; 李四这个月剩下的前不够交房租了&#xff0c;找张三借1000元急用&#xff1a; &#xff08;1&#xff09;给张三的账户余额 减去1000元 updata 账户表 set money money -…

《deepseek FlashMLA :高效的 MLA 解码内核》:此文为AI自动翻译

FlashMLA GitHub - deepseek-ai/FlashMLA FlashMLA 是适用于 Hopper GPU 的高效 MLA 解码内核&#xff0c;针对可变长度序列服务进行了优化。 当前发布&#xff1a; BF16、FP16块大小为 64 的分页 kvcache 快速开始 安装 python setup.py install 基准 python tests/test_fl…

Windows对比MacOS

Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1&#xff1a;打开环境变量设置窗口步骤 2&#xff1a;添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1&#xff1a;打开终端步骤 2&#xff1a;编辑环境变量配置文件步骤 3&#xff1…

蓝桥杯 之 填空题-位运算与循环

文章目录 循环握手问题门牌制作-循环小球反弹幸运数艺术与篮球跑步 位运算3个1美丽的2024 位运算 可以关注这个Lowbit(x) 如何判断最低位是否是1&#xff1f; num&1 1就说明num最低位是1 循环 循环 握手问题 握手问题 思路分析&#xff1a; 可以直接计算出来&#xff…

Java进阶——反射机制超全详解

反射能在运行时动态操作类和对象的能力&#xff0c;极大地增强了程序的灵活性。但是反射的使用也伴随着性能开销和安全风险。本文将由博主带你一起深入探讨 Java 反射的核心概念、关键类和方法&#xff0c;以及在日常开发中的应用场景。 本文目录 一、反射的核心概念1. 运行时类…