串口实现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  < 0)//缓冲区没有足够的数据
    {
        return USARTREADOVER;//读数据越界
    }
    while (length--)
    {
        *buf = Rusart->Recerivrbuffer[Rusart->Pread];
        buf++;
        Rusart->Count --;
        Rusart->Pread++;//读取指针自加
        if(Rusart->Pread == RECERIVRSIZE)
        {
            Rusart->Pread =0;
        }

    }
    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 =0;
        }

    }
    return USARTOK;//数据读取成功

}

/*清空缓冲区*/
void Usart_fifo_Clear(Usart_RecerivePoint Rusart)
{
    Rusart->Count = 0;
    Rusart->Pread =0;//读指针为0
    Rusart->Pwrite = 0;//写指针为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);

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

时间: 2024-11-05 23:41:31

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

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

前面设计好了界面,现在就开始写代码了,首先定义一个串口对象.. SerialPort serialport = new SerialPort();//定义串口对象 添加串口扫描函数,扫描出来所有可用串口显示在下拉框中,同时设置接受函数 string[] ArryPort = SerialPort.GetPortNames(); comboBox1.Items.Clear(); for (int i = 0; i < ArryPort.Length; i++) { comboBox1.Items.

GD32F450的串口DMA收发+接受完成中断

GD32的库比较糟糕当时完全是参考STM32的驱动来的,当然我也知道直接用ST的库可以,但是原因比较特殊就不多说了. 代码就不贴了,以后用GD的机会我想不会太多. 先初始化串口,使能串口,使能接受完成中断. 再初始化DMA通道.贴一段 1 int fputc(int ch, FILE *f) 2 { 3 usart_data_transmit(USART0, (uint8_t)ch); 4 while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)

STM32F407的串口采用DMA收发数据

?? STM32F407的串口采用DMA收发数据 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN8 开发环境:MDK5.13 mcu: stm32f407VGT6 说明: 之前用STM32F103实现DMA收发串口数据,现在项目中采用STM32F407,所以将此机制移植到F4上. STM32F103上用DMA收发串口数据文章: STM32的串口采用DMA方式发送数据测试 STM32的串口采用DMA方式接收数据测试 源代码: 串

jquery中ajax方法load get post与脚本文件如php脚本连接时,脚本怎样接受数据?

例如jquery实现ajax,用load()方法 $("div").load("gethint.php",{username:'mars'}); 则在php脚本gethint.php中用$_POST[]来接受数据,load()用post方式传送数据. 用$.get()方法时用$_GET[]接受 用$.post方法时用$_POST接受

单片机第11课:串口通信查询方式---从计算机接受数据

如何用计算机给单片机发送数据,单片机如何接收数据呢? JP3与P0口相连接.从计算机给单片机发送一个十六进制数据,然后看数码管的显示. #include<reg51.h> /* *给单片机发送一个十六进制的数据,用来显示数码管 */ void initSer(); void main() {<span> </span>initSer(); while(1) { //查询RI的值,如果是1,那么接收到了数据,此时应该软件清零,RI = 0 if(RI == 1) { RI

STM32的串口空闲中断及接受数据

源程序: IO口定义: void GPIO_ConfiguraTIon(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 第1步:打开GPIO和USART部件的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* 第2步:将US

利用串口空闲中断接收数据

1 void USART2_IRQHandler(void) 2 { 3 // 使能串口空闲中断 4 USART_ITConfig(USART2, USART_IT_IDLE , ENABLE); 5 6 if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET) 7 { 8 9 rx_buf[cnt]=USART_ReceiveData(USART2); 10 rx_rxbuf[cnt] = rx_buf[cnt] ;//把接收到的数组存到备用的数组当中,

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

一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数,找到使用的file_operations,即应用程序与tty架构的统一接口.步骤不再赘述. static const struct file_operations tty_fops = { .llseek = no_llseek, .read = tty_read, .write = tty_wr

编写HTML表单提交并接受数据信息(获取用户通过表单提交的内容)

MyInfoForm.java package com.fxl; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServlet