对buffer的简单理解

定义了一个Bufffer:
BYTE   buf=new   BYTE[0x100000]
说明:首先定义一个buffer,说白了就是申请一块内存空间,new返回的是一个指针,所以这里的声明有错的,应该这样:
BYTE   *pBuf   =   new   BYTE[0x100000];
如果申请成功,则返回了该内存空间的首地址,如果申请失败则返回NULL。

1。如何向这个buffer写入数据?
说明:如果是一般的字符数据,那么可以用strcpy/strncpy,不过看你申请了这么多,应该是二进制数据吧,那可以使用memcpy函数。
举例:写入数据到第100个内存空间
BYTE   *pBuf   =   new   BYTE[0x100000];
memset(pBuf,0,0x100000);//初始化buffer
BYTE   data[3]={1,2,3};
memcpy(pBuf+100,data,sizeof(data));
memcpy(&(pBuf[100]),data,sizeof(data));//和上面的结果一样
//这块buffer的第101,102,103字节的数据变成了1,2,3
//即:pBuf[100]==1,pBuf[101]==2,pBuf[102]==3

2。能从buffer中的任意位置写入数据么?比如首地址加偏移量。
上面的例子已经说明问题了。
3。如何读出buffer的数据?
读出数据也很简单:
BYTE   data[3];
memcpy(data,pBuf+200,sizeof(data));
4。如何测定这个buffer的实际使用长度?
如果你的数据都是非0的数据,那么可以使用strlen,但是如果里面有0的数据就不能使用了,此时你可以在前面写入数据的时候做一个计数,因为你每次写 入多少字节的数据你是知道的。
举例:
int   nCount   =   0;
BYTE   *pTemp   =   pBuf;//临时指针
BYTE   data1[3]   =   {1,0,3};
BYTE   data2[3]   =   {11,0,33};
memcpy(pTemp,data1,sizeof(data1));
nCount   +=   sizeof(data1);
memcpy(pTemp,data2,sizeof(data2));
nCount   +=   sizeof(data2);
此时的有效数据长度就是nCount的值
5。如何清空这个buffer的内容?
memset(pBuf,0,0x100000);

 

最后使用buffer结束后记得释放内存:
delete   []pBuf;
这里实际上就是一个指针的应用~

### STM32 FIFO基本概念 FIFO(First In First Out),即先进先出队列,是一种特殊的线性数据结构。对于STM32而言,FIFO不仅存在于软件层面用于临时存储待处理的数据流,还作为硬件特性集成于DMA控制器之中[^2]。 当提及STM32内部的FIFO机制时,主要指的是DMA模块内嵌的一个固定大小的缓冲区,该缓冲区能够暂存来自外部设备或内存的数据项直到这些项目被处理器读取或者写入目标位置。通过这种方式,可以在不打断当前CPU操作的情况下完成大量数据传输任务,从而提高系统的整体效率并减轻核心负担[^1]。 具体来说,在带有FIFO功能的DMA配置下,每当触发一次DMA请求后,相应的外设会向DMA发送一定数量的数据单元至其内部寄存器;而后再由DMA自动将这批数据按照顺序转移到指定的目的地址空间里去。这一过程中间所使用的中间过渡区域就是所谓的“FIFO”。 ### 应用实例:基于DMA+FIFO的串口通信优化 考虑到实际应用场景下的需求差异,下面给出一个具体的例子来说明如何利用STM32自带的FIFO特性改善串口通讯性能: 假设有一个场景需要频繁接收较长长度的消息包并通过UART接口传递给上位机或者其他节点。为了防止因消息过长而导致丢失部分信息的情况发生,可以采取如下措施: - **启用DMA模式**:设置好相关参数使能DMA通道并与特定UART端口关联起来; - **调整FIFO阈值**:根据预期最大单次传输量合理设定FIFO水位线,确保每次都能尽可能多地装载有效载荷而不至于溢出; - **构建循环缓冲区**:创建一段足够大的静态数组充当环形队列的角色,用来累积尚未完全组装完毕的信息片段直至形成完整的报文为止; 以下是简化版C语言代码示例展示上述思路的具体实现方式: ```c #include "stm32f4xx_hal.h" #define BUFFER_SIZE 256 // 定义环形缓冲区尺寸 uint8_t rxBuffer[BUFFER_SIZE]; /* 接收缓冲 */ volatile uint16_t head = 0; /* 缓冲头指针 */ volatile uint16_t tail = 0; /* 缓冲尾指针 */ void UART_DMA_Init(UART_HandleTypeDef *huart){ HAL_UART_Receive_DMA(huart, (uint8_t*)rxBuffer, BUFFER_SIZE); } // 处理接收到的新字符 void ProcessReceivedChar(uint8_t ch){ if ((head + 1) % BUFFER_SIZE != tail){ // 检查是否有足够的空间容纳新到来的数据 rxBuffer[head++] = ch; head %= BUFFER_SIZE; // 这里可以根据实际情况加入协议解析逻辑... } } ``` 这段程序展示了怎样借助DMA配合FIFO以及简单的环形缓冲策略有效地管理异步到达的数据序列,进而达到稳定可靠地交换较大规模二进制资料的目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值