电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

基于STM32芯片环形缓冲区的构建(IAR EWARM环境)

除了通信协议以外,设置数据缓冲区是完善不同速率,或不同系统之间通信的解决方案之一。本文设置了一个环形缓冲区,来接收PC上位机通过串口(COM口)发往STM32下位机的数据,具体代码如下:

 

//接受数据处理相关定义

 

#define RxSize 16           //接收缓冲区大小

u8 RxBuffer[RxSize];   //缓冲区定义

u8 RxPut = 0;  //接收缓冲区(环形)的当前放人位置

u8 RxGet = 0;  //接收缓冲区()的当前取出位置

u8 RxEff = 0;   //接收缓冲区(环形)中的元素总数量

 

//利用去除存入缓冲区数据的冗余信息后,将有用数据存入命令缓存

u8 command[7];  //命令缓存,用于存放收到的命令(最长命令为五个字符,其中加上起始符和结尾符,共7个字符)

u8 comm_length; //命令长度,命令解码时用

 

 

//接受缓冲区读取函数

u8 Address(u8);

void put(u8 z);

u8 get(void);

 

 

void decode(void);//解码程序

void get_command(u 8 c);     //识别命令格式,并存入命令缓冲区

 

 

//函数实现

/*******************************************************************************

环形缓冲区的地址编号计算函数,,如果到达唤醒缓冲区的尾部,将绕回到头部。

环形缓冲区的有效地址编号为:0到 RxSize

 

*******************************************************************************/

//接受缓冲区地址运算

u8 Address (u8 i)

{

        return (i+1)==RxSize ? 0 : i+1;

}

 

//从环形缓冲区中取一个元素

u8 get(void)

{

    u8 pos;

    if (RxEff>0)

      {

              pos = RxGet;

              RxGet = Address(RxGet);

              RxEff--;

              return RxBuffer[pos];

      }

    else

      return '~';  //标志缓冲区中的数据被读完

 

}

 

 

//向环形缓冲区中放人一个元素

void put(u8 z)

{

    if (RxEff= '0' && c <= '9') || (c >= 'A' && c <= 'Z'))

       {

              command[comm_length] = c; //指令字符放入命令缓存

              comm_length++;   

       }    

      

  else

       {

                       //空语句

       }

}

博主
jluhong
jluhong's Blog
            点滴每一天!
点击跳转