在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 吴宝林
上一篇:stm32 usart在DMA模式下只能发送一次
下一篇:STM32中GPIO的8种模式
推荐阅读
史海拾趣
随着Gateway业务的不断发展,公司开始寻求更多的市场曝光。1987年,Gateway在《Computer Shopper》杂志上投放了一版独特的广告,吸引了众多消费者的目光。1991年,公司推出了彰显其牧场起家背景的别具一格的奶牛花斑盒状商标,这一创新举措获得了全国消费者的认可,进一步提升了Gateway的品牌知名度和市场地位。
(请注意,由于篇幅限制,以上两个故事为简化版。在实际写作中,可以进一步扩展每个故事,包括更详细的背景信息、人物对话、市场反应等。)
由于篇幅所限,这里只提供了两个故事概要。如果需要更多关于Gateway或其他电子公司的发展故事,可以进一步研究和撰写。
随着市场的不断发展,Delphi Connection Systems公司意识到单靠自身的力量难以在激烈的市场竞争中立足。于是,公司积极寻求与其他企业的战略合作,通过资源共享、优势互补,共同开拓市场。公司与一家知名的汽车制造商建立了战略合作关系,为其提供高质量的连接器产品,从而成功进入了汽车电子行业市场。
为了进一步提升市场竞争力,G-Mag在2015年启动了国际化布局战略。公司首先在欧洲市场设立了研发中心和销售中心,随后又逐步拓展到亚洲、非洲等多个地区。在国际化过程中,G-Mag注重本土化运营和品牌建设,根据不同地区的市场特点和消费者需求推出定制化产品和服务。同时,G-Mag还积极参与国际展会和交流活动,提升品牌知名度和影响力。通过国际化布局,G-Mag成功打开了全球市场的大门,实现了业务的快速增长和品牌的全球化发展。
随着市场的不断变化和客户需求的多样化,Analog Microwave Design公司意识到单一的产品线已经无法满足市场需求。为了丰富和完善产品线,公司开始加大对新产品的研发力度。除了继续深耕微波器件领域外,公司还积极拓展相关领域的产品线,如射频模块、天线等。通过不断推出新产品,公司不仅满足了客户的多样化需求,还进一步巩固了市场地位。
自上世纪80年代起,丹纳赫集团通过一系列的战略并购,逐渐扩大其在电子行业的影响力。这些并购不仅为丹纳赫集团带来了先进的技术和产品,还增强了其在全球市场的竞争力。其中,对Leica显微系统公司的收购标志着丹纳赫集团正式涉足生命科学业务,为其在电子显微镜和生命科学仪器领域的发展奠定了基础。
丹纳赫集团起源于1984年,由Steven Rales和Mitchell Rales兄弟二人创立。他们的愿景是建立一个致力于持续改善并提升客户满意度的制造公司。名字“Dana”源自古老的凯尔特语,寓意奔腾不息的精神和不断改善的品质。起初,丹纳赫集团并未直接涉足电子行业,但随着公司的发展,逐渐将业务范围扩展至包括电子设备和技术的领域。
来自北美混合动力车车主们的投诉,使混合动力等电动汽车遇到了一场信任危机。 危机来自一向非常关注自身权益的北美消费者,一些混合动力车的消费者声称,他们车内的电磁辐射问题较为严重,甚至引发身体不适。加拿大的一家监测机构也表示,他 ...… 查看全部问答∨ |
设计特色: 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 ...… 查看全部问答∨ |
51單片機寫9850控制字的子程序如下: void dds9850_w(void) { extern num_input; uint ret,i,tw; uchar xdata *addr = DDS1_FRQ4; ret = 0; i = 0; ...… 查看全部问答∨ |
W25X16-SPI-NorFlash 参考周立功SST25VF016B例程得到的,在此谢谢周公了。TI-9B96给的实在是没跑通在LM3S上。 我用的LM3S811,50MHZ时钟,SPI配的是25MHZ(配26MHZ时本人的片子跑不起来了),W25Q16(W25X16升级版,除了高级功能剩下的和W25 ...… 查看全部问答∨ |
|
本帖最后由 dontium 于 2015-1-23 13:22 编辑 作者:Bonnie C. Baker,德州仪器 (TI) 高级应用工程师 关键字:模拟电路设计、电容、电阻、转换器、ADC、工业应用、医疗电子、运算放大器、系统设计、工程教育、物理验证和分析、信号完整性 ...… 查看全部问答∨ |