STM32F1X RS485使用DMA发送丢失数据的处理方法。

news2025/1/12 17:54:49

串口通过DMA发送一帧数据时总是缺少2个字节,且最后一个字节数据为0xff的原因及解决方法

本次记录为采用485串口发送数据,发送模式是循环检测串口数据寄存器为空(TXE)和发送完成标志位(TC)。DMA发送串口方式

按照以上程序编译运行时,发现装置每次发送一帧报文都不完整,总是缺少2个字节且最后一个字节为0xff。
 根据本人的猜想,应该是数据还没来及发送出去就使能了485接收,导致数据发送不完整,随后又上网查看了类型问题,终于查到说进入DMA发送完成中断以后,还要延时2-4ms等待串口数据完全发送出去才使能485接收。按照以上的结论修改了DMA发送完成中断函数,如下

                        
原文链接:https://blog.csdn.net/more_thinking/article/details/108575952

DMA发送完成中断处理  

在其中加入延时函数

/********************************************************************
* name         : DMA1_Channel7_IRQHandler
* description  : 
* Input        : 
* Output       : 无
* Return       : 
********************************************************************/
void DMA1_Channel7_IRQHandler(void)
{
    if(DMA_GetFlagStatus(DMA1_FLAG_TC7))
    {
        delaydma1_flag_tc7_ms(2);
        DMA_ClearFlag(DMA1_FLAG_TC7); //清除全部中断标志
        DMA_ClearFlag(DMA1_FLAG_GL7);// 清除DMA1的通道4的所有中断标志,因为只有发送完成标志,所以直接全部清除
        USART_ClearFlag(USART1,USART_FLAG_TC);// 在关中断前先清中断标志,防止是串口上一个数据发送时的中断标志
        USART_ITConfig(USART1, USART_IT_TC, ENABLE);// DMA1传输完成后使能Usart1发送完成中断
        D_RS485DE_RE = DISABLE;//重新使能串口接收
    }
}

 DMA发送部分程序 

打开485发送使能

D_RS485DE_RE = ENABLE;    

void Write_Lcd_Mem(uint16_t addr, uint16_t *pBuffer, uint8_t len)
{
#ifdef DMA_SEND
    uint8_t i;
    rt_enter_critical();
    Usartx_SendData(USART2, D_DGUS_FRAME_HEAD1);
    Usartx_SendData(USART2, D_DGUS_FRAME_HEAD2);
    Usartx_SendData(USART2, 2 * len + 3);
    Usartx_SendData(USART2, 0x82);
    Usartx_SendData(USART2, addr >> 8);
    Usartx_SendData(USART2, addr & 0xff);
    for(i = 0; i < len; i++)
    {
        Usartx_SendData(USART2, *(pBuffer + i) >> 8);
        Usartx_SendData(USART2, *(pBuffer + i) & 0xff);
    }
#ifdef D_PC_SEND
    Usartx_SendData(USART2, D_DGUS_FRAME_END1);
    Usartx_SendData(USART2, D_DGUS_FRAME_END2);
#endif
    rt_thread_delay(50);//
    rt_exit_critical();
#endif
    
    uint8_t i;
    D_RS485DE_RE = ENABLE;    
    g_aUSART2_TX_BUF[0] = D_DGUS_FRAME_HEAD1;
    g_aUSART2_TX_BUF[1] = D_DGUS_FRAME_HEAD2;
    g_aUSART2_TX_BUF[2] = 2 * len + 3;
    g_aUSART2_TX_BUF[3] =  0x82;
    g_aUSART2_TX_BUF[4] =  addr >> 8;
    g_aUSART2_TX_BUF[5] =  addr & 0xff;
    for(i = 0; i < len; i++)
    {
        g_aUSART2_TX_BUF[2 * len + 3 + i] =  *(pBuffer + i) >> 8;
        g_aUSART2_TX_BUF[2 * len + 3 + i] =  *(pBuffer + i) & 0xff;
    }
#ifdef D_PC_SEND
    g_aUSART2_TX_BUF[2 * len + 5] = D_DGUS_FRAME_END1;
    g_aUSART2_TX_BUF[2 * len + 6] = D_DGUS_FRAME_END2;
#endif
    Usart2_TX_DMA_Enable( 2 * len + 7);
    rt_thread_delay(50);
}

经测试 协议发送完整

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

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

相关文章

基于java,springboot和vue房屋租赁租房销售平台设计

摘要 在现代城市生活中&#xff0c;房屋租赁市场一直是一个活跃且复杂的领域。随着互联网技术的不断发展&#xff0c;基于Spring Boot和Vue的房屋租赁系统应运而生&#xff0c;旨在提供一个高效、方便、可靠的在线服务平台。该系统利用了前后端分离架构的优势&#xff0c;后端…

【嵌入式学习】QT-Day1-Qt基础

笔记 https://lingjun.life/wiki/EmbeddedNote/20QT 毛玻璃登录界面实现&#xff1a;

模式匹配这么好,Java语法里有吗?

这篇文章我们借助新版Java来理解模式匹配&#xff0c;Rust版的模式匹配稍后就端上来&#xff0c;各位先尝尝Java这杯老咖啡还香不香&#x1f604;。 什么是模式匹配&#xff1f; 下图直观的表达了模式匹配的概念。 所谓模式类似上图中木盒的各种形状的洞洞&#xff0c;我们…

UG NX二次开发(C#)-PMI-获取PMI尺寸数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX的三维模型中添加PMI尺寸信息3、采用二次开发获取尺寸数据4、测试结果1、前言 PMI(Product and Manufacturing Information)是产品和制造信息的简称,主要用于将产品部件设计的…

工具分享:在线键盘测试工具

在数字化时代&#xff0c;键盘作为我们与计算机交互的重要媒介之一&#xff0c;其性能和稳定性直接影响到我们的工作效率和使用体验。为了确保键盘的每个按键都能正常工作&#xff0c;并帮助用户检测潜在的延迟、连点等问题&#xff0c;一款优质的在线键盘测试工具显得尤为重要…

智能运维乱象有哪些?智能运维业务包括哪些

在实施智能运维过程中可能遇到的乱象及其原因&#xff0c;系统地阐述智能运维业务所涵盖的各个方面&#xff0c;包括但不限于预防性维护、故障检测与诊断、自动化修复以及持续的性能优化等关键组成部分。 实施智能运维过程中可能遇到的乱象及原因包括&#xff1a; 数据不一致或…

Qt|大小端数据转换(补充)

Qt|大小端数据转换-CSDN博客 之前这篇文章大小端数据转换如果是小数就会有问题。 第一个方法&#xff1a; template <typename T> static QByteArray toData(const T &value, bool isLittle) {QByteArray data;for (int i 0; i < sizeof(T); i) {int bitOffset…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

电脑文件msvcr110.dll缺失的多种解决方法,msvcr110.dll文件修复手段

遭遇"程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll"这样的错误提示&#xff0c;是Windows操作系统用户可能会遇到的一种情况。尽管这种现象在一些用户中较为常见&#xff0c;但解决这一问题并非复杂的过程。本文将深入剖析此问题&#xff0c;并分享一些实用的…

2.16日学习打卡----初学Dubbo(一)

2.16日学习打卡 目录: 2.16日学习打卡一. 什么是分布式&#xff1f;二. 什么是RPC?三. Dubbo概念_简介四. Dubbo核心组件五.Dubbo配置开发环境六. Dubbo配置开发环境_管理控制台 一. 什么是分布式&#xff1f; 可以看我的这篇文章–2.14日学习打卡----初学Zookeeper(一) 二.…

【设计模式】23种设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法&#xff0c;和大量抽象的方法&#xff0c;具体的方法是为外界提供服务的点&#xff0c;具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A&#xff0c;希望A的a方法被修饰 …

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高&#xff0c;Kotlin 红色线框区域即为选中的原图中心区域&#xff0c;放大后放到等宽高的ImageView里面。 import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactor…

Mybatis | 初识Mybatis

初识Mybatis 目录: 初识Mybatis什么是Mybatis&#xff1f;Hibernate 和 MyBatis的区别&#xff1f;Mybatis的下载和使用Mybatis的工作原理 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#…

牛客网 OR141 密码检查

答案&#xff1a; #include <stdio.h> #include <string.h> #include <ctype.h> int main() {int n 0;int count1 0, count2 0, count3 0;scanf("%d", &n);while (n--){char ch[100];scanf("%s", ch);int len strlen(ch);if (…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…

element-ui 自定义表头label(利用 :slot=“header“ slot-scope=“slot“)

<el-table :data"Gbtable" border style"width: 100%"><el-table-column prop" date" label"责任方" align"center" ></el-table-column><el-table-column prop"name" label"柜名"…

图片文字编辑软件app分享5个!

在数字化时代&#xff0c;图片和文字的结合已经成为信息传播的重要形式之一。无论是制作精美的海报、设计独特的社交媒体封面&#xff0c;还是简单地为图片添加一些说明性文字&#xff0c;都离不开专业的图片文字编辑软件。今天&#xff0c;就让我们一起探索那些不可错过的图片…

ai自动证件照片制作的软件?分享3款先进工具!

随着科技的发展&#xff0c;我们的生活变得越来越便捷。尤其在图像处理领域&#xff0c;AI技术的应用更是让许多传统行业焕发出新的活力。其中&#xff0c;AI证件照制作工具就是近年来备受瞩目的创新产品。这些工具利用先进的AI技术&#xff0c;帮助用户在家中就能轻松制作出专…

【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交

修改最近一次的提交信息的方法有很多&#xff0c;可以参考这篇文章&#xff0c;但是对于之前的提交信息进行修改只能使用 rebase。 修改提交信息 假设我们想修改下面这个提交信息&#xff0c;想把【登录】改成【退出登录】步骤如下 运行 git rebase -i head~3 打开了一个文本…

open3d 点云体素化

open3d 点云体素化 一、算法原理1.从点云到体素化&#xff08;主要函数&#xff09;2.从网格到体素化&#xff08;主要函数&#xff09; 二、代码三、结果1.从点云到体素化2.从网格到体素化 四、相关数据 一、算法原理 点云和三角网格是非常灵活但不规则的几何类型。体素网格是…