串口使用DMA发送数据时的数据覆盖问题

发布者:boyatang最新更新时间:2018-09-11 来源: eefocus关键字:串口  DMA  发送数据  数据覆盖 手机看文章 扫描二维码
随时随地手机看文章

在STM32等单片机中,为了提高程序的执行效率,在使用串口时,经常会使用DMA的方式来进行收发数据,这样,CPU只需要把数据放在发送缓存区即可离开。


但是,由于在串口发送中使用的是引用调用,即数据传递时是将要发送的指针进行传递,而非将数据复制了一份。这样的好处是方便快捷,但同时带来的一个后果时,当该数据还未发送完时,下一串数据就不能放入该发送缓冲区,否则,就会发生数据覆盖问题,即后一串数据覆盖前边还未发完的数据。


一般发生这种数据覆盖问题,都是在连续发送两串以上数据的时候,第一次的还没发完,后边的就会将前一次的数据覆盖。


若是在每次发送之前进行判断上次数据是否发完,如果没有发完就等待的话,就会降低CPU的效率;或者,如果在每次使用串口发送函数的前边或后边使用延时的话,就可以解决这样的问题,但是如果这样做,那使用DMA的意义就没有了。


所以为了解决这个问题,笔者自己想到了一种建立双缓冲区的方法,直接贴代码:


void SendData(uint8_t* pData, uint16_t dataLen)

{

    uint8_t ret = 0;

static uint8_t num = 0;

static uint8_t buffer1[256] = {"\r\n"};

static uint8_t buffer2[256] = {0};

    //使用DMA发送时,建立双缓冲区交替发送,防止数据的覆盖

if(num == 0)

{

ret = DMA_USART1_Transmit(buffer1, strlen((const char*)buffer1));

if(ret == 0)

{

num++;

memset(buffer2, 0, sizeof(buffer2));

strcat((char*)buffer2, (char*)pData);

}

else

{

strcat((char*)buffer1, (char*)pData);

}

}

else

{

ret = DMA_USART1_Transmit(buffer2, strlen((const char*)buffer2));

if(ret == 0)

{

num--;

memset(buffer1, 0, sizeof(buffer1));

strcat((char*)buffer1, (char*)pData);

}

else

{

strcat((char*)buffer2, (char*)pData);

}

}

    

}


在上段代码中函数SendData()为外部调用,参数为需要发送的字符串以及发送数据的长度。函数DMA_USART1_Transmit()为真正的发送函数,在该函数中,发送成功会返回0,如果当前有数据正在发送则返回1,返回其他为发送错误。


该部分代码的想法就是,在发送时,先发送buffer1中的数据,在发送buffer1的数据时,之后传过来需要发的数据都存放在buffer2中,当buffer1发送完成之后,就发送buffer2的数据,这时传过来的数据全部存放在buffer1中。这样采用交替发送的方式,利用双缓冲区,就可以有效的解决单缓冲区的数据覆盖问题。287320150   13568401331 吴宝林


关键字:串口  DMA  发送数据  数据覆盖 引用地址:串口使用DMA发送数据时的数据覆盖问题

上一篇:stm32 usart在DMA模式下只能发送一次
下一篇:STM32中GPIO的8种模式

推荐阅读最新更新时间:2024-03-16 16:13

瑞萨单片机串口下载仿真程序的硬件搭建和操作流程
瑞萨单片机可提供E8A和串口两种方式用于调试和下载程序,使用E8A调试比较简单都不需要什么配置就直接可以使用,很方便。但E8A仿真器价格高,对于个人玩玩的话再买个E8A来说可能不太划算,所以就动手整了下串口调试下载功能。该教程可以方便的实现串口调试下载功能。 一、开发平台: 操作系统:Windows XP 瑞萨开发环境:HEW 瑞萨烧写工具:FDT 使用单片机:L357C 参考文档:L357C单片机Datasheet,M16C/R8C FoUSB/UART软件用户手册 二、硬件原理 根据瑞萨L357C单片机Datasheet手册附录中,附录2:和串行编程器连接的例子。L357C单片机使用UART0作为串行编程器的通信口
[单片机]
瑞萨单片机<font color='red'>串口</font>下载仿真程序的硬件搭建和操作流程
stm32L151 tim trigger adc定时器触发单通道adc采样dma传输
“` include “adc.h” ifdef Debug include “led.h” include “string.h” uint16_t tb=0; //char dat ={0,}; uint8_t tc=0; endif __IO uint16_t ADC_ConvertedValue ; define ADC1_DR_ADDRESS ((uint32_t)0x40012458) static void dma_adc_init(void) { DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /—
[单片机]
stm32L151 tim trigger adc定时器触发单通道adc采样<font color='red'>dma</font>传输
SPI总线单片机发送数据的C51程序
关于spi协议见: http://hi.baidu.com/gilbertjuly/blog/item/0be222eeac9abae5cf1b3e38.html ISD4002芯片资料参考: http://download.csdn.net/source/1208805 以下是单片机spi通信的通用程序,在不同晶振情况下可能需调整延时。这里单片机晶振为11.0592MHz。 _nop_();语句指延迟一个机器周期,约1us左右。写1bit约10us,spi传输率约100kbit/s。 程序中只用了MOSI,/SS,SCLK信号,没有用MISO信号。 #include REGX52.H #include string
[单片机]
SPI总线单片机<font color='red'>发送</font><font color='red'>数据</font>的C51程序
ARM7串口9位方式多机遇信的编程技术
1 主从式多机通信     所谓主从式多机系统,即在数个ARM(或单片机)中,有一个是主机,其余的为从机。从机要服从主机的调度、支配,其拓扑结构如图1所示。     主机信息可以发到各个从机,从机发送的信息只能被主机接收,从机之间不进行通信。     51单片机串口不同寻常的特征是包括第9位方式(在串口模式2和模式3下)。它允许把在串行口通信增加的第9位用于标志特殊字节的接收。一般约定第9位为高时表示该字节为地址字节,第9位为低时为数据字节。第9位方式允许接收单片机信息,仅当字节具有一个第9位时才能被中断。用这种方式,主机首先广播1字节,并让其第9位为高,同时收到该字节的各个从机,只有地址相符的打开,以接收后面的数据字节。所
[单片机]
上位机串口的通信编程
上位机串口通信主要介绍通信串口的初始化和串口缓冲区数据的读取,因为此处只是作为指令来读取,数据量小,所以缓冲区数据的读取为有数据接收便触发串口的数据接收事件。
[单片机]
上位机<font color='red'>串口</font>的通信编程
虚拟串口以及在Proteus中的使用
一、虚拟串口 虚拟串口是计算机通过软件模拟的串口,当其它设计软件使用到串口的时候,可以通过调用虚拟串口仿真模拟,以查看所设计的正确性。首先要安装虚拟串口设置的软件,网上有很多设置虚拟串口的软件,我用的是VSPD,可试用1个月,试用期过后,该软件将不能使用,但不用担心,所设置的虚拟串口不会消失,可以继续使用。 设置界面: 我设置的是COM3和COM4,软件只能成对设置,主要是因为通信时,一方可以监视另一方,如果仅设置1个虚拟串口的话,如你用COM3发送接收数据,但发送了什么接收到什么,你无法验证其正确与来源。这是人家编写软件的高明之处。软件设置时将所设置的两个虚拟串口对接,这样就可实现发送与接收的监视。从设备管理器中可以看到
[单片机]
用Proteus学习51单片机之串口
串口的理论知识我就不记了,网上多的是。51单片机的串口,有4种方式,分别为方式0,方式1,方式2,方式3.由于我的目的,使用串口主要是为了和电脑进行通信,所以主要使用方式1(事实上我也只学了方式1,其他方式等用到的时候再学吧)。 串口的方式1,其波特率与定时器T1相关,公式如下: 方式1波特率 = (2SMOD×32)/(T1溢出率) SMOD是一个寄存器,一般我们就取0了 T1的溢出率,即每秒T1计数满几次(相关知识可以看看前面笔记的记录) 正是因为如上的公式,所以设置TH1和TL1的初值,就能控制方式1的波特率了。不过一般波特率是固定的那么几种,像2400,4800和9600等,要用的时候查一下初值就成了。 由于用的是Prot
[单片机]
用Proteus学习51单片机之<font color='red'>串口</font>
Nios系统基础上的UItra DMA数据传输模式
引 言   随着消费类电子,如MP3、3G手机、视频终端以及宽带无线网络的普及,对大容量存储设备的需求越来越强烈。传统的SRAM、SDRAM以及DDR SDRAM等存储设备的价格与容量比,远远比硬盘高;光存储设备虽然更加廉价,但是在便携性上却远逊于硬盘解决方案。现在硬盘厂商提供了各种适用于不同用途的廉价海量存储设备,如1 in(英寸)的微硬盘可以应用于各种小巧的便携设备中,2.5in硬盘可以应用于笔记本和移动存储中,3.5in硬盘可以应用于个人PC和工业自动化中等等。   目前,硬盘支持的最为广泛的IDE接口协议中,规定了PIO、DMA以及Ultra DMA三种数据传输模式,其传输速率PIO 多字DMA   Ultra DMA
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved