历史上的今天
今天是: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 吴宝林
史海拾趣
|
本人使用VISTA 操作系统,在不更换操作系统的前提下,想问问有没有支持它的编程器,价格相对廉价的?主要用于烧写C51类的IC。 [ 本帖最后由 DIAG 于 2009-12-19 18:54 编辑 ]… 查看全部问答> |
|
在Edit中的Configuration设置,主要包括字体大小颜色 1.Editor: 2.Colors&Fonts设置字体大小和颜色 一般就选中ARM:Editor C Files,然后在Element选择要修改的项目,在Font中选择颜色和字体 3.User Keywords 用户的关键字 在这里可 ...… 查看全部问答> |
|
这是2005年ST在其英文网站中作的一个在线研讨会后整理的一个问题解答汇总,虽然已时隔一年多,但其中的许多问题还是具有代表性,现翻译出来供大家参考。2005年底,我们在中电网上曾经用中文进行过相同内容的在线研讨会。上面提到的在线研讨会 ...… 查看全部问答> |
|
那里有CIP(common industrial protocol)协议代码,那位同仁用过告诉下! 最近搞个项目,要用CIP应用层协议,但是代码找来找去就是没有,只有英文协议规范 。哪位用过,知道告诉下,谢谢!… 查看全部问答> |
|
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.\ ...… 查看全部问答> |
|
Achronix开始交付其22纳米Speedster22i系列FPGA 大家还记得这个Achronix吗?之前Altera和Xilinx大力的推28nm的FPGA的时候,它就宣称要推出22nm的器件,先在终于开始把器件发给客户了。 Achronix Semiconductor公司今日宣布:公司已开始将其业界领先的Speedster®22i HD1000可编程逻辑器件(F ...… 查看全部问答> |




