历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2018年09月11日 | 串口使用DMA发送数据时的数据覆盖问题

发布者:boyatang 来源: 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种模式

推荐阅读

(1)NVIC(嵌套向量中断):NVIC是Cortex-M3核心的一部分,关于它的资料不在《STM32的技术参考手册》中,应查阅ARM公司的《Cortex-M3技术参考手册》Cortex-M3的向量中断统一由NVIC管理。(2)EXTI(外部中断):EXTI是ST公司在其STM32产品上扩展的外中断控制。它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断(PVD,RTC alarm,USB wakeup,et...
  很多人会把老年代步车和电动汽车混为一谈,认为老年代步车就是电动汽车,对于老年代步车来说,实则是低速电动车,从两者之间的定义可以看出,电动汽车无论在技术优势上面还是车辆的安全系数上面都是要高于老年代步车的,从技术上面来说,电动汽车有着网联化,智能化等结构特点。  在车辆动力系统上面,运用了三电技术,尤其是电控系统,能够决定车辆...
我们先简单回顾下什么是示波器的触发。由于信号无时无刻都在变化,如果一股脑的都把他们显示在示波器上,就会很乱,根本无法让我们看清楚,从而也就无法观察信号来解决问题。考虑到信号大多数时候都是以某种规律周期性出现的,因此我们只要找到他重复的规律,把每一次重复叠加显示在示波器上,信号就可以稳定观察了。这种把信号稳定显示就是触发,也叫同步...
智东西(公众号:zhidxcom)作者 | 健恩编辑 | 云鹏智东西9月11日报道,昨天,世界机器人大会再次在北京亦庄拉开帷幕,智东西记者一大早便跨越整个北京城来到这里打探这场大会的最新消息。世界机器人大会自2015年开始举办,迄今为止已成功举办过5次。它不仅是国内一年一度规模最大的机器人产业顶级展会,也是国内机器人产业风向的集中展示。智东西了解...

史海拾趣

问答坊 | AI 解惑

新能源车遇“电磁危机” 安全遭质疑

来自北美混合动力车车主们的投诉,使混合动力等电动汽车遇到了一场信任危机。   危机来自一向非常关注自身权益的北美消费者,一些混合动力车的消费者声称,他们车内的电磁辐射问题较为严重,甚至引发身体不适。加拿大的一家监测机构也表示,他 ...…

查看全部问答∨

5V700ma充电器方案---成熟方案,多家采用

设计特色: z  原边采样与反馈,无光耦和TL431 z  5%精确的CV/CC z  系统经济,外围简单 z  待机功耗小于250mW z  满足EPS2.0 对于效率的要求 z  无X和Y 电容设计 z  无音频噪音 z  短路自动重启   ...…

查看全部问答∨

请问:各位用 camera 抓回来的视频信号的 [显示效果] 怎么样啊?

我用的2440camera抓回来的视频信号(模拟转为数字)显示效果很差: 用灰阶测试,其中有一格偏暗的效果最差,有明显的横的一块一块的东西,其他的则还相对较好 之前一直觉得是视频AD这边的问题,对AD芯片的地、电源都作过处理,但效果不明显 请教 ...…

查看全部问答∨

有关mw5.0,directshow中NondelegatingRelease问题

请问,我在debug下就出现1个问题:error LNK2001: unresolved external symbol "public: virtual unsigned long __cdecl CBaseFilter::NonDelegatingRelease(void)" (?NonDelegatingRelease@CBaseFilter@@UAAKXZ) 在release下就没有(wchar_t ...…

查看全部问答∨

偶的程序出了點問題,不知道怎么回事(單片機的C)

51單片機寫9850控制字的子程序如下: void dds9850_w(void) {     extern num_input;     uint ret,i,tw;     uchar xdata *addr = DDS1_FRQ4;     ret = 0;     i = 0;     ...…

查看全部问答∨

求助:窗口看门狗

if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET){     RCC_ClearFlag();}WWDG_DeInit();RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);WWDG_SetPrescaler(WWDG_Prescaler_8);  ...…

查看全部问答∨

发一个LM3S简单读写W25X16的小程序

W25X16-SPI-NorFlash 参考周立功SST25VF016B例程得到的,在此谢谢周公了。TI-9B96给的实在是没跑通在LM3S上。   我用的LM3S811,50MHZ时钟,SPI配的是25MHZ(配26MHZ时本人的片子跑不起来了),W25Q16(W25X16升级版,除了高级功能剩下的和W25 ...…

查看全部问答∨

只需一个电路即可满足系统解析度和 12 位精度要求

本帖最后由 dontium 于 2015-1-23 13:22 编辑 作者:Bonnie C. Baker,德州仪器 (TI) 高级应用工程师   关键字:模拟电路设计、电容、电阻、转换器、ADC、工业应用、医疗电子、运算放大器、系统设计、工程教育、物理验证和分析、信号完整性 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved