串口实现FIFO接受数据
基本原理:静态队列
/*
* 串口的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接受数据的更多相关文章
- 串口实现FIFO接受数据(V2)
在上一次的基础上添加了不同需求缓冲区大小可变的更改. /* * 串口的FIFO简单读取实现 * 功能,实现串口的FIFO实现 * 使用方法: * 更新时间:2017.9.26 * 版本:v2.0.0 ...
- 串口通信:接受数据(仿真task写法)
1.功能描述 设计一个串口数据接收模块.能够以设定的波特率(与发射端口速率匹配)接收数据,并输出保存到一个寄存器中. 2.过程描述 ①边沿检测器,识别出起始位时让接收使能端有效.这里需要排除边沿脉冲的 ...
- RS232串口用事件接受数据(一问一答)
private void button1_Click(object sender, EventArgs e) { serialPort1.Open(); serialPort1.DataReceive ...
- C#上位机制作之串口接受数据(利用接受事件)
前面设计好了界面,现在就开始写代码了,首先定义一个串口对象.. SerialPort serialport = new SerialPort();//定义串口对象 添加串口扫描函数,扫描出来所有可用串 ...
- linux串口驱动分析——发送数据
一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...
- dsp28377控制DM9000收发数据——第三版程序,通过外部引脚触发来实现中断接受数据,优化掉帧现象
//-------------------------------------------------------------------------------------------- - //D ...
- STM32串口接收不定长数据原理与源程序(转)
今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...
- STM32F407的串口采用DMA收发数据
源:STM32F407的串口采用DMA收发数据
- 纠错:基于FPGA串口发送彩色图片数据至VGA显示
今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...
随机推荐
- LeetCode 36 Valid Sudoku
Problem: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board ...
- 5. UIView
1. UIView 的初认识 官方文档 UIView class defines a rectangular area on the screen and the interfaces for man ...
- Ruby混合类型
当一个类拥有可以从多个父类继承的特点,类应该显示多重继承. Ruby没有直接支持多继承,但Ruby模块有另一个精彩使用.他们几乎消除多重继承的需要,提供了一个工厂,称为混入. 混合类型给一个精彩的控制 ...
- JavaScript获取时间戳、日期格式化
一. js获取时间戳: 第一种方法: var timestamp1 = Date.parse(new Date()); 第二种方法: var timestamp2 = (new Date()) ...
- SQL中TOP,LIMIT,ROWNUM的用法
SQL SERVER/MS Access的Select Top的用法: Select TOP number|percent table_columname FROM tablename MySQL/O ...
- xml之dom4j解析
* 使用dom4j解析xml 实例在java520里面 TextDom4j * dom4j,是一个组织,针对xml解析,提供解析器dom4j * dom4j不是javase的一部分,想要使用第一步需要 ...
- 17.Java 反射机制
1.反射的定义 反射之中包含了一个"反"的概念,所以要想解释反射就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生 ...
- 如何把Qlik Sense嵌入到Web应用中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这是一个给初学者(尤其对VS不熟悉的BI工程师)的入门操作向导. Qlik Sense是 ...
- 前端js调用七牛制作评价页面案例
一.需求 公司所有的上传页面都用七牛,前端不免要直接调用七牛的代码进行上传,以下是一个实现七牛上传的案例,制作一个常见的商品评价页面,页面需求很常见当上传到第五章图片的时候,上传按钮消失,上传需要显示 ...
- Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能-转自阿里中间件
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...