当前位置: 首页 > news >正文

【嵌入式软件】STM32 UART转485通信问题

1.背景

在原来的文章中,已经测试了RS485的电路

【嵌入式】RS485通信+硬件

经过多次测试,没有问题。

但是在通信的过程中,偶尔会发生错误。

2.问题集合

2.1通信错位问题

2.1.1 问题描述

        最近某台设备采用的MODBUS协议,返回的数据格式应该是

1 3 4 ef 8e 0 f ee ac

        但是实际收到的数据是:

ee 1 3 4 ef 8e 0 f ee

        上面的数据出现了数据错位

2.1.2 解决方法

        1)首先要保证uart的rx引脚配置为上拉,不要外接下拉电阻;因为uart的通信起始位 是低电平开始,可能会导致数据判断错误;

        2)rs485为半双工通信,在数据发送结束后,需要等待一段时间后再去接收数据;

        这是因为,虽然uart已经发送完成了,但是485驱动器还需要切换电平,硬件缓冲区可能已清空,但驱动器可能还需要一点时间将最后一个位完全驱动到总线上。立即切换可能导致最后一个位被截断。这个延迟通常需要至少 1 个字符的传输时间(例如,对于 115200bps,1 个字符 10 位:10 / 115200 ≈ 87us)。更保守的做法是等待 2-3 个字符时间。可以使用简单的 for循环延时或定时器实现。

        3)程序处理框架

HAL_StatusTypeDef RS485_SendData(uint8_t *pData, uint16_t Size, uint32_t Timeout) {HAL_StatusTypeDef status;RS485_DIR_TX(); // 切换到发送模式status = HAL_UART_Transmit(&huart1, pData, Size, Timeout); // 阻塞发送if (status == HAL_OK) {// 等待发送寄存器真正空 (TC 标志)while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET) {}// 关键延迟:等待最后一个位完全发出 (至少 1 个字符时间)// 这里使用简单的循环延时,实际应用中建议使用定时器或计算精确时间volatile uint32_t delay = SystemCoreClock / 1000000 * 100; // 大约 100us 延时 (根据你的波特率调整!)while (delay--);}RS485_DIR_RX(); // 切换回接收模式 (无论发送成功与否)return status;
}// 接收数据函数 (与普通 UART 接收一样)
HAL_StatusTypeDef RS485_ReceiveData(uint8_t *pData, uint16_t Size, uint32_t Timeout) {return HAL_UART_Receive(&huart1, pData, Size, Timeout);
}

2.1.3 要点

        1)切换时机是核心:​​ 过早切换回接收模式会截断自己发送的数据;过晚切换会错过总线上的响应或增加总线冲突风险。​发送完成后的延迟至关重要。

        2)延迟计算:​​ 延迟时间需要根据你的波特率计算。例如

        (1)波特率 9600bps:1 位时间 ≈ 104us,1 个字符 (10 位:1 起始 + 8 数据 + 1 停止) ≈ 1.04ms。延迟建议 > 1.04ms。

        (2)波特率 115200bps:1 位时间 ≈ 8.68us,1 个字符 ≈ 86.8us。延迟建议 > 87us。

        (3)使用 HAL_Delay()进行毫秒级延迟通常足够,但对于高波特率,需要更精确的微秒级延迟(如定时器或 DWT计数器)。

http://www.dtcms.com/a/487000.html

相关文章:

  • MATLAB离群点检测与删除
  • 星Day-33 基础补充
  • 网站后台换qqwindows7 iis配置 网站
  • 网站推广的最终目的是什么网站建立步骤
  • Apache Paimon:为大规模数据场景打造 “统一存储语言”
  • Hadoop生态核心组件全面解析
  • 考研408《计算机组成原理》复习笔记,第五章(4)——CPU的【硬布线控制器】
  • 01 MySQL数据库基础入门指南
  • 医疗网站建设代理商动漫设计师资格证
  • 从零理解 KV Cache:大语言模型推理加速的核心机制
  • Nginx部署Vue项目,网页界面返回404 Not Found
  • 建设部招标网站郑州企业建设网站有什么好处
  • 天硕国产工业级固态硬盘:主动浪涌防护,破解工业存储安全难题
  • 多重防护设计:BL-08plus如何杜绝交叉污染保障检测安全
  • 小说一键生成动漫重庆seo整站优化效果
  • dz门户网站模板比较有名的公司网站
  • 中小企业智能云MES系统源码,实时采集生产现场数据,优化生产流程
  • 建设网站的一般步骤是机械设备网站源码
  • IIS 配置和重写模块下载
  • Centos Stream 9 中Docker安装出现 download.docker.com:443 的问题解决
  • 医院 AI + 冷热源集群控制系统:医疗场景下的能效与安全双保障方案​
  • 初始yolo
  • 知名做网站哪家好wordpress ckplay播放
  • 什么程序做网站安全网站集约建设后网站域名规范
  • 自己做网站 知乎兰州网络推广电话
  • 隧道COVI检测仪:守护隧道安全与畅通
  • MySQL数据库基本命令的8个模块
  • HIS系统天花板,十大核心模块,门诊/住院/医保全流程打通,医院数字化转型首选
  • 做营销型网站的公司做医疗器械网站怎么找高清大图
  • 网站建设教程学习在百度平台如何做营销