发表于《串口缓存函数》
10年8个月前IP:广东
814320
1楼
感:
1. 变量命名问题很大,Buff和buff一起用,不利于阅读。
2. 缓冲区溢出之后,就要将整个缓冲区shift一个字节(O(N)),性能上不利。
3. 缓冲区内已有的字节个数,应该用一个计数器变量进行计数,而不是每次都从头开始数(O(N))。

总的来说:
1. 如果缓冲区的长度不是5而是65536,这份代码将会超慢。
2. 无法接收0x00。

附本人项目用FIFO缓存代码一份(用于缓冲串口收发数据供异步读写)。

//------------------------------------------
//fifobuffer
#ifndef sizeofbuffer
#define sizeofbuffer 64
#endif
uchar bufferoperating =0;
 
typedef struct{
  uchar head;
  uchar tail;
  uchar buf[sizeofbuffer];
}fifobuffer;
 
void fifobufferinit(fifobuffer *b){ 
  b->head=0;
  b->tail=0;
  //b->buf=(uchar*)malloc(sizeof(uchar)*bufsize);
}
 
void fifobufferin(fifobuffer *b,uchar input){
  b->buf[b->tail]=input;
  b->tail++;
  b->tail%=sizeofbuffer;
}
 
uchar fifobufferout(fifobuffer *b){   
  uchar output=b->buf[b->head];
  b->head++;
  b->head%=sizeofbuffer;
  return output;
}
 
uchar fifobufferremain(fifobuffer *b){
  if(b->tail < b->head){return b->tail + sizeofbuffer - b->head;}
  return b->tail-b->head;
}
评论
文号 / 814320

万流景仰
名片发私信
学术分 16
总主题 1270 帖总回复 8407 楼拥有证书:学者 机友 笔友
注册于 2008/03/29 15:34:00最后登录 2022/01/09 14:09:34
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:0

个人简介

已走,勿送

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的