串口缓存函数
qazwqsx2016/03/31软件综合 IP:美国
参考了Novakon的算法改了一下队列式缓存。短了很多。

<code class="lang-cpp">//单纯的算法研究
//小的语法错误请无视
//关于串口接收缓存的研究
#define Max 5
/*****************************************************/
u8 buff[Max];
u8* Out;
void SerialManage_ListModel(){//队列式缓存
    u8 BuffIn;
    int i;
    BuffIn=SerialRead();
    buff[0]=BuffIn;
    for(i==Max-2;i<=0;i++){         buff[i]="buff[i+1];"     } } ***************************************************** 环形缓存 u8* read; write; u8 buff[max]; bool empty; void serialmanage_ringmodel_init(){     read="&buff[0];"     write="&buff[0];" serialmanage_ringmodel_write(){     *write="SerialRead();"     if(write="=&buff[Max-1]){"         ringmanage();         write="&buff[0];"         }         else{         write++; serialmanage_ringmodel_read(){     u8 buff;     buff="*Read;"     if(read="=&buff[Max-1]){"         read="&buff[0];"         read++;         return ringmanage_write(){         if(read="=&buff[Max-1]){"             read++;     < code></=0;i++){></code>

[修改于 8年9个月前 - 2016/03/31 12:51:27]

来自:计算机科学 / 软件综合
14
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon
8年9个月前 IP:广东
814320
感:
1. 变量命名问题很大,Buff和buff一起用,不利于阅读。
2. 缓冲区溢出之后,就要将整个缓冲区shift一个字节(O(N)),性能上不利。
3. 缓冲区内已有的字节个数,应该用一个计数器变量进行计数,而不是每次都从头开始数(O(N))。

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

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

<code class="lang-cpp">//------------------------------------------
//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;
}</code>
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
qazwqsx作者
8年9个月前 IP:美国
814325
很厉害,学习了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
8年9个月前 IP:浙江
814329
请不要在已有对主贴内容回复的情况下修改主贴内容
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
qazwqsx作者
8年9个月前 IP:美国
814331
<code class="lang-cpp">//单纯的算法研究
//小的语法错误请无视
//关于串口接收缓存的研究
#define Max 5
/*****************************************************/
u8 buff[Max];
u8* Out;
int Timer;
void SerialManage_ListModel_Init(){
    Timer=0;
    Out=&buff[Timer];
}
void SerialManage_ListModel_Read(){//队列式缓存
    u8 BuffIn;
    int i;
    BuffIn=SerialRead();
    buff[0]=BuffIn;
    Timer++;
    for(i==Max-2;i<=0;i++){         buff[i]="buff[i+1];"     }     out="&buff[Timer];" } ***************************************************** 环形缓存 u8* read; write; u8 buff[max]; bool empty; void serialmanage_ringmodel_init(){     read="&buff[0];"     write="&buff[0];" serialmanage_ringmodel_write(){     *write="SerialRead();"     if(write="=&buff[Max-1]){"         ringmanage();         write="&buff[0];"         }         else{         write++; serialmanage_ringmodel_read(){     u8 buff;     buff="*Read;"     if(read="=&buff[Max-1]){"         read="&buff[0];"         read++;         return ringmanage_write(){         if(read="=&buff[Max-1]){"             read++;     < code></=0;i++){></code>
改进版
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
8年9个月前 IP:广东
814333
真的不想太严苛待人,但是必须给楼主几个忠告:
1. 麻烦找本算法书先看上半年。
2. 你需要实现的东西,别人已经实现了一千遍,所以尽量多谷歌。
3. 不要把“自己想出来的”垃圾代码当成算法研究发到论坛上。



编程,其实就是将编程者脑中的逻辑转化为计算机逻辑,所以首先编程者要在脑子里对问题有清晰的认识。
算法与数据结构方面的知识是你的良师益友,不要跳过它们妄图一飞冲天。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
csaaa
8年9个月前 IP:浙江
814453
引用 qazwqsx:
//单纯的算法研究
//小的语法错误请无视
//关于串口接收缓存的研究
#define Max 5
/*****************************************************/
u8 buff; ...
鼓励一下,不要受别人影响。继续这样下去即可。我看好你。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
8年9个月前 IP:广东
815433
前面这几份都没有临界区保护代码,没太大实用性……
实际多线程、前后台都需要临界区保护的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
8年9个月前 IP:广东
815452
引用 amo:
前面这几份都没有临界区保护代码,没太大实用性……
实际多线程、前后台都需要临界区保护的。
我的架构是异步的,没有这个必要。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
8年9个月前 IP:广东
815476
引用 novakon:
我的架构是异步的,没有这个必要。
正因为是异步的,更容易出问题。
中断会在你的用户程序任何一个地方插入……你在C里的一行语句,可能是需要N条汇编指令才能执行完的
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
8年9个月前 IP:广东
815485
引用 amo:
正因为是异步的,更容易出问题。
中断会在你的用户程序任何一个地方插入……你在C里的一行语句,可能是需要N条汇编指令才能执行完的
你仔细看我的代码。in和out这两个函数,操作的内存地址并没有重叠……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
8年9个月前 IP:浙江
815560
引用 amo:
正因为是异步的,更容易出问题。
中断会在你的用户程序任何一个地方插入……你在C里的一行语句,可能是需要N条汇编指令才能执行完的
基本的读写函数没必要考虑到这些情况吧,如果存在OS,再补充同步机制(比如利用OS实现自旋锁),或者控制对共享的资源的使用也可以解决。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
8年9个月前 IP:广东
815690
引用 phpskycn:
基本的读写函数没必要考虑到这些情况吧,如果存在OS,再补充同步机制(比如利用OS实现自旋锁),或者控制对共享的资源的使用也可以解决。
从代码里的u8、uchar就能看出是用在资源较少的MCU……
如果封装没做好,出了问题基本上很难查找。
封装可以参考C里的IO函数,如fwrite(),A线程不停写“123”,B线程不停写“456”,C线程不停写“789”,绝不会出现“147”这种数
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
szmoniter
8年7个月前 IP:广东
819282
看这代码的可读性,就毫无兴趣了,1楼的比楼主的要好的多
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
qazwqsx
进士 机友 笔友
文章
30
回复
36
学术分
0
2013/10/20注册,3年5个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}