基本原理:静态队列

/*
* 串口的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. STM32F412应用开发笔记之四:与远红外炭氢传感器通讯

    远红外炭氢传感器是在多组分气体传感器中用来检测甲烷和丙烷浓度的,采用单总线串行通讯,TTL电平.所以我们需要用到UART口来实现与远红外炭氢传感器的通讯. 远红外传感器就是这个样子的: 再来一张进气和 ...

  2. 使用NPOI读取Excel报错ICSharpCode.SharpZipLib.Zip.ZipException:Wrong Local header signature

    写了一个小程序利用NPOI来读取Excel,弹出这样的报错: ICSharpCode.SharpZipLib.Zip.ZipException:Wrong Local header signature ...

  3. [Android Pro] Android开发实践:为什么要继承onMeasure()

    reference to : http://www.linuxidc.com/Linux/2014-12/110164.htm Android开 发中偶尔会用到自定义View,一般情况下,自定义Vie ...

  4. 【转载】兼容php5,php7的cURL文件上传示例

    转载来自: http://www.huanlinna.com/2016/06/25/coding/php5-php7-upload-demo-via-curl.html https://segment ...

  5. Puppet自动化运维-C/S架构概念(1)

    1.Puppet工作模式 (1)采用C/S架构(即是server<=>client) (2)Master 会对自己形成自签名CA中心,对Agent端进行证书颁发,验证通过才允许Agent( ...

  6. Good Bye 2016

    A - New Year and Hurry (water) #include <bits/stdc++.h> using namespace std; int main() { ]; ; ...

  7. cant create oci environment

    网上这些人真是七里八里呀,下了navicat premium,想连接远程数据库,结果报cant create oci environment. 看了好几篇帖子博客,都说要下一个instantclien ...

  8. 在Myeclipse中提交代码到GitHub中

    这需要借助插件Egit,首先就是先下载该插件了,可以再eclipse中下载,也可以在外面下载,下载就不说了.下载地址git://github.com/houyongchao/plugin-Egit.g ...

  9. [资料分享]7天搞定Node.js微信公众号开发

  10. iTunes使用总结

    UDID查询 将设备连接至电脑,打开iTunes至设备摘要页面,鼠标点击"序列号"区域切换显示UDID