基本原理:静态队列

/*
* 串口的FIFO简单读取实现
* 功能,实现串口的FIFO实现
* 使用方法:
* 版本:v1.0.0
*
*/
#include "sys.h"
#include "usartbuf.h" USARType Usart_fifo_Read( Usart_RecerivePoint Rusart,uint8_t * buf,uint8_t length)
{
if (Rusart->Count - length < )//缓冲区没有足够的数据
{
return USARTREADOVER;//读数据越界
}
while (length--)
{
*buf = Rusart->Recerivrbuffer[Rusart->Pread];
buf++;
Rusart->Count --;
Rusart->Pread++;//读取指针自加
if(Rusart->Pread == RECERIVRSIZE)
{
Rusart->Pread =;
} }
return USARTOK;//数据读取成功
} /*向缓冲区中写入length个数据*/
USARType Usart_fifo_write(Usart_RecerivePoint Rusart,uint8_t * buf,uint8_t length)//
{
if (Rusart->Count + length > RECERIVRSIZE)//写入的数据超过缓冲区
{
return USARTWRITEOVER;//写数据越界
}
while(length--)
{
Rusart->Recerivrbuffer[Rusart->Pwrite] = *buf;//赋值给缓冲区
buf++;//缓冲区地址加一
Rusart->Count ++;
Rusart->Pwrite++;//
if(Rusart->Pwrite == RECERIVRSIZE)
{
Rusart->Pwrite =;
} }
return USARTOK;//数据读取成功 } /*清空缓冲区*/
void Usart_fifo_Clear(Usart_RecerivePoint Rusart)
{
Rusart->Count = ;
Rusart->Pread =;//读指针为0
Rusart->Pwrite = ;//写指针为0
}
#ifndef  _USARTBUF_H
#define _USARTBUF_H
/*该参数设置接受区大小*/
#define RECERIVRSIZE 64//接受区大小
typedef struct {
int Pread;//读指针
int Pwrite;//写指针
int Count;//缓冲区计数
uint8_t Recerivrbuffer[RECERIVRSIZE];//接受缓冲区
}Usart_ReceriveType,*Usart_RecerivePoint; #define USARType int
#define USARTREADOVER -2//串口数据超出
#define USARTWRITEOVER -3//串口写数据越界
#define USARTOK 1 USARType Usart_fifo_write(Usart_RecerivePoint Rusart,uint8_t * buf,uint8_t length);USARType Usart_fifo_Read( Usart_RecerivePoint Rusart,uint8_t * buf,uint8_t length);
void Usart_fifo_Clear(Usart_RecerivePoint Rusart); #endif/*_USARTBUF_H*/

使用方式:定义一个Usart_ReceriveType类型的缓冲队列,然后就可以利用上述文件中提供的三个函数来实现串口的FIFO的数据接受和读取

使用的时候可以利用

USARType Usart_fifo_write(Usart_RecerivePoint Rusart,uint8_t * buf,uint8_t length);

USARType Usart_fifo_Read( Usart_RecerivePoint Rusart,uint8_t * buf,uint8_t length);

这两个函数来向缓冲区中写入和读取数据,其中参数的含义如下

第一个参数(Rusart)是串口缓冲区指针类型,用来标示串口,

第二个参数(buf)是一个指uint8_t类型的指针,用来指向要写入或者读取数据的首地址,

第三个参数(length)表示要写入或者读取的数据长度

出口参数USARType 实际是一个整形数据,返回值得意义入下

#define USARTREADOVER –2//串口数据超出

#define USARTWRITEOVER -3//串口写数据越界

#define USARTOK 1// 串口缓冲区数据读出或者写入成功

void Usart_fifo_Clear(Usart_RecerivePoint Rusart);

这个函数用来清空缓冲区数据,实现起来比较简单

串口实现FIFO接受数据的更多相关文章

  1. 串口实现FIFO接受数据(V2)

    在上一次的基础上添加了不同需求缓冲区大小可变的更改. /* * 串口的FIFO简单读取实现 * 功能,实现串口的FIFO实现 * 使用方法: * 更新时间:2017.9.26 * 版本:v2.0.0 ...

  2. 串口通信:接受数据(仿真task写法)

    1.功能描述 设计一个串口数据接收模块.能够以设定的波特率(与发射端口速率匹配)接收数据,并输出保存到一个寄存器中. 2.过程描述 ①边沿检测器,识别出起始位时让接收使能端有效.这里需要排除边沿脉冲的 ...

  3. RS232串口用事件接受数据(一问一答)

    private void button1_Click(object sender, EventArgs e) { serialPort1.Open(); serialPort1.DataReceive ...

  4. C#上位机制作之串口接受数据(利用接受事件)

    前面设计好了界面,现在就开始写代码了,首先定义一个串口对象.. SerialPort serialport = new SerialPort();//定义串口对象 添加串口扫描函数,扫描出来所有可用串 ...

  5. linux串口驱动分析——发送数据

    一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...

  6. dsp28377控制DM9000收发数据——第三版程序,通过外部引脚触发来实现中断接受数据,优化掉帧现象

    //-------------------------------------------------------------------------------------------- - //D ...

  7. STM32串口接收不定长数据原理与源程序(转)

    今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...

  8. STM32F407的串口采用DMA收发数据

    源:STM32F407的串口采用DMA收发数据

  9. 纠错:基于FPGA串口发送彩色图片数据至VGA显示

    今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...

随机推荐

  1. 【linux】scp命令

    scp的作用是在不同主机之间传输文件. 用法: scp user@host:/path1 path2 说明: 把远程主机host中path1的内容拷贝到当前主机的path2 user是远程主机登陆用户 ...

  2. C#连接SQLServer数据库基本实现

    (在这写下来,防止以后忘记) 在VS2012中新建一个Windows窗口应用程序,并在Form中放置DataGridView和Button两个控件,在Button的单击响应事件中连接数据库: priv ...

  3. windows下ThinkPHP3.2.3使用memcache缓存

    准备 要使用memcache,首先要安装配置好memcache服务memcached: 下载http://downloads.northscale.com/memcached-win64-1.4.4- ...

  4. 2016年6月20日 JAVA知识框架

    基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1  JAVA简介 2  JAVA编程环境 3  JAVA基本编程结构 4 ...

  5. Java多线程与静态方法

    Java无基础开发Android应用,发现对静态方法理解不够,有如下问题: 在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?是否会发生线程安全问题? ...

  6. 那些年,坑死自己的事之fread/fwrite

    今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到wind ...

  7. Linux面试知识点总结

    1.Linux关机重启命令: 在linux命令中reboot是重新启动,shutdown -r now是立即停止然后重新启动,都说他们两个是一样的,其实是有一定的区别的.    shutdown命令可 ...

  8. 与你相遇好幸运,gen8安装

    gen8到手后,立马去买了 SSD https://item.jd.com/2010277.html 支架 https://item.jd.com/2671609.html NAS盘 https:// ...

  9. POCO库——Foundation组件之日期时间DateTime

    日期时间DateTime:内部提供多个设计计时器.日期.时区.时间戳等: Clock.h :Clock时钟计时类,_clock:Int64类型时钟值,CLOCKVAL_MIN.CLOCKVAL_MAX ...

  10. 基于netty-socketio的web推送服务

    实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推 ...