历史上的今天
返回首页

历史上的今天

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

正在发生

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

2018-09-11 来源:eefocus

在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 吴宝林


推荐阅读

史海拾趣

HDK(北陆电气)公司的发展小趣事

对于STM32与四线电阻触摸屏的接口电路,网友可能会有以下一系列问题,我将逐一进行回答:

1. STM32如何与四线电阻触摸屏连接?

回答:STM32与四线电阻触摸屏的连接主要通过STM32的GPIO口实现。通常,STM32的多个GPIO口会分别连接到四线电阻触摸屏的X+、X-、Y+、Y-四个引脚。这些引脚用于驱动和检测触摸屏上的触摸动作。

2. 如何在STM32上配置GPIO以支持四线电阻触摸屏?

回答:在STM32上配置GPIO以支持四线电阻触摸屏时,需要将相应的GPIO口配置为模拟输出(用于驱动触摸屏)或模拟输入(用于读取触摸屏上的电压信号)。此外,还需要配置中断引脚来检测触摸屏是否被触摸。具体的配置步骤包括设置GPIO的模式(如推挽输出、上拉输入等)、速度以及是否启用中断等。

3. 如何使用STM32读取四线电阻触摸屏的坐标值?

回答:读取四线电阻触摸屏的坐标值通常涉及两步操作:首先,通过驱动触摸屏的X+或Y+引脚为高电平,并同时保持对应的X-或Y-引脚为低电平,以在触摸屏上形成电压梯度;然后,使用ADC(模数转换器)读取另一侧的X+或Y+引脚上的电压值。根据读取到的电压值与参考电压的比例关系,可以计算出触摸点的X或Y坐标。为了获得更准确的坐标值,通常需要进行多次读取并取平均值。

4. 是否需要外部控制芯片来实现STM32与四线电阻触摸屏的接口?

回答:不一定需要外部控制芯片。STM32的GPIO口和ADC功能已经足够强大,可以直接与四线电阻触摸屏接口。然而,在某些情况下,为了简化电路设计或提高触摸检测的精度和稳定性,可能会使用如XPT2046这样的专用触摸屏控制芯片。这些芯片内部集成了A/D转换器和触摸屏控制逻辑,可以通过SPI等接口与STM32通信,从而简化软件设计。

5. 如何进行触摸屏的校准?

回答:触摸屏的校准是为了确保触摸点与实际屏幕坐标之间的准确对应。通常,在触摸屏首次使用或更换后需要进行校准。校准过程包括在触摸屏上选择几个已知的点(如屏幕的四个角),然后记录这些点对应的ADC值。通过计算这些点的ADC值与实际屏幕坐标之间的关系,可以得到校准参数(如缩放因子和偏移量)。在后续的触摸检测中,可以使用这些校准参数将ADC值转换为实际的屏幕坐标。

6. STM32与四线电阻触摸屏接口电路中的常见问题有哪些?

回答:STM32与四线电阻触摸屏接口电路中的常见问题可能包括:

  • 触摸屏无响应:可能是由于GPIO配置错误、ADC配置不当或触摸屏硬件故障等原因导致。
  • 坐标偏移:可能是由于触摸屏未正确校准或校准参数设置错误导致。
  • 触摸点跳动:可能是由于触摸屏表面有污渍、静电干扰或ADC采样不稳定等原因导致。

解决这些问题的方法通常包括检查GPIO和ADC的配置、重新校准触摸屏以及清洁触摸屏表面等。如果问题依然存在,可能需要检查触摸屏硬件是否损坏。

Fairchild (ON Semiconductor)公司的发展小趣事

随着技术的不断进步和市场的不断扩大,Fairchild Semiconductor开始将目光投向全球市场。公司积极开拓海外市场,与全球各地的企业建立合作关系,共同推动半导体技术的发展。通过不断努力,Fairchild逐渐在全球半导体市场中占据了重要地位。

Denyo Europa Gmbh公司的发展小趣事

Denyo Europa Gmbh公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品检测,每一个环节都严格把关。公司还定期对员工进行质量意识培训,确保每一个员工都能深刻理解质量对于企业发展的重要性。这种对质量的执着追求,使公司的产品在市场上赢得了良好的口碑。

Bridgelux公司的发展小趣事

XXXX年,中国电子信息产业集团公司(CEC)和重庆临空开发投资公司牵头收购了Bridgelux。这次收购为Bridgelux带来了强大的资本支持和市场资源,使其得以进一步扩大生产规模,提升研发能力。在CEC和重庆临空的支持下,Bridgelux在全球范围内的市场份额逐步提升,品牌影响力不断增强。

Bel Power Solutions公司的发展小趣事

随着技术的不断进步,Bel Power Solutions始终保持着对创新的热情。公司不断加大研发投入,积极引进先进技术和人才,推动产品的升级换代。其中,一项重要的技术突破是公司成功研发出具有高效能、高可靠性特点的电源转换技术。这一技术的推出,不仅提升了公司产品的竞争力,还为客户提供了更加优质、可靠的电源解决方案。同时,公司还根据市场需求,推出了多款定制化、个性化的电源产品,满足了不同客户的特殊需求。

ETL semiconductor公司的发展小趣事

AMD(Advanced Micro Devices)在半导体行业中的发展经历了一个从追赶到逆袭的过程。在英特尔的强大市场压力下,AMD通过不断创新和技术提升,逐渐在处理器市场上获得了一席之地。尤其是在游戏和高端计算领域,AMD的处理器凭借其出色的性能和性价比赢得了众多消费者的青睐。

问答坊 | AI 解惑

电梯对讲系统

一、KRS二芯总线制电梯专用五方对讲系统1、 真正的二线总线制,布线成本低: 每24台电梯只需布一根二芯RVV0.75总线到值班室,布线成本不到传统四线制的1/48(例如:一个24台电梯的小区,按传统通话系统的布线须布96根以上线从电梯至值班室,而采用本 ...…

查看全部问答>

有支持WINDOWS VISTA 操作系统的编程器么?

本人使用VISTA 操作系统,在不更换操作系统的前提下,想问问有没有支持它的编程器,价格相对廉价的?主要用于烧写C51类的IC。 [ 本帖最后由 DIAG 于 2009-12-19 18:54 编辑 ]…

查看全部问答>

关于KEIL的一些使用技巧和设置

在Edit中的Configuration设置,主要包括字体大小颜色 1.Editor:   2.Colors&Fonts设置字体大小和颜色 一般就选中ARM:Editor C Files,然后在Element选择要修改的项目,在Font中选择颜色和字体 3.User Keywords 用户的关键字 在这里可 ...…

查看全部问答>

STR71xF常见问题解答

这是2005年ST在其英文网站中作的一个在线研讨会后整理的一个问题解答汇总,虽然已时隔一年多,但其中的许多问题还是具有代表性,现翻译出来供大家参考。2005年底,我们在中电网上曾经用中文进行过相同内容的在线研讨会。上面提到的在线研讨会 ...…

查看全部问答>

那里有CIP(common industrial protocol)协议代码,那位同仁用过告诉下!

最近搞个项目,要用CIP应用层协议,但是代码找来找去就是没有,只有英文协议规范 。哪位用过,知道告诉下,谢谢!…

查看全部问答>

信号限幅怎么办?

我用一个AD743运放电路时,输入正玄波,输出是方波,是不是限幅了,怎么才能输出放大的正玄波?…

查看全部问答>

C8051F120 U-EC6 调试下载问题

1.“Communication could not be established with the specified adapter.Please confirm the current adapter selection and cable connection” 2.“Target could not be reset.Confirm cable and power connections and retry.”   3.\ ...…

查看全部问答>

有用转接板的吗

zigbee开发板玩了一段时间了,现在想在面包板上焊个玩玩,但CC2530是QFN封装的,所以想到用转接板,当在淘宝上找了半天,没有QFN40转接,难道要画PCB制板吗?或者有其他方法?请大侠们指点一下。…

查看全部问答>

Achronix开始交付其22纳米Speedster22i系列FPGA

大家还记得这个Achronix吗?之前Altera和Xilinx大力的推28nm的FPGA的时候,它就宣称要推出22nm的器件,先在终于开始把器件发给客户了。 Achronix Semiconductor公司今日宣布:公司已开始将其业界领先的Speedster®22i HD1000可编程逻辑器件(F ...…

查看全部问答>

单片机发展方向

大家觉得单片机的发展方向怎么样…

查看全部问答>