注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

耳朵的博客

做自己想做的人

 
 
 

日志

 
 

AVR 串口收发 使用环形缓冲区实现的程序源代码  

2010-10-15 11:30:51|  分类: AVR |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
整个工程下载:


关键代码:
UART.h:
/******** 串口收发 环形缓冲区实现 ********
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: ATmega128
* 文件名.......: UART.h
* 编译器.......: IAR for AVR V5.5
* 创建时间.....: 2010.10.15
* 最后修改.....: 2010.10.15
*****************************************/
#ifndef __UART_H__
#define __UART_H__

#include <ioavr.h>
#include "../main.h"    /* F_CPU */

#define UART_BAUD                9600         //波特率

#define UART_TXBUF_LENGTH        500
#define UART_RXBUF_LENGTH        500

#if UART_TXBUF_LENGTH <= 0xff
#define UART_TXBUF_HEAD_TAIL_TYPE  unsigned char
#else
#define UART_TXBUF_HEAD_TAIL_TYPE  unsigned int
#endif /* UART_TXBUF_LENGTH */

#if UART_RXBUF_LENGTH <= 0xff
#define UART_RXBUF_HEAD_TAIL_TYPE  unsigned char
#else
#define UART_RXBUF_HEAD_TAIL_TYPE  unsigned int
#endif /* UART_TXBUF_LENGTH */

typedef struct
{
    unsigned char data[UART_TXBUF_LENGTH];
    UART_TXBUF_HEAD_TAIL_TYPE head;
    UART_TXBUF_HEAD_TAIL_TYPE tail;
    UART_TXBUF_HEAD_TAIL_TYPE number;
}UART_TXBUF;

typedef struct
{
    unsigned char data[UART_RXBUF_LENGTH];
    UART_RXBUF_HEAD_TAIL_TYPE head;
    UART_RXBUF_HEAD_TAIL_TYPE tail;
    UART_RXBUF_HEAD_TAIL_TYPE number;
}UART_RXBUF;

extern volatile UART_TXBUF My_UART_TxBuf;
extern volatile UART_RXBUF My_UART_RxBuf;
extern void UART_Init(void);
extern void UART_TxByte(unsigned char _data);


#endif /* __UART_H__ */


UART.c:
/******** 串口收发 环形缓冲区实现 ********
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: ATmega128
* 文件名.......: UART.c
* 编译器.......: IAR for AVR V5.5
* 创建时间.....: 2010.10.15
* 最后修改.....: 2010.10.15
*****************************************/
#include "UART.h"

volatile UART_TXBUF My_UART_TxBuf;
volatile UART_RXBUF My_UART_RxBuf;

void UART_Init(void)
{
    UBRR0L = (F_CPU / 16L / UART_BAUD - 1);
    UCSR0B_RXEN0 = 1;         // 接收使能
    UCSR0B_TXEN0 = 1;         // 发送使能
    UCSR0B_RXCIE0 = 1;        // 接收结束中断使能
    UCSR0B_TXCIE0 = 1;        // 发送结束中断使能

    // 缓冲区初始化
    My_UART_TxBuf.head = 0;
    My_UART_TxBuf.tail = 0;
    My_UART_TxBuf.number = 0;
    My_UART_RxBuf.head = 0;
    My_UART_RxBuf.tail = 0;
    My_UART_RxBuf.number = 0;

    __enable_interrupt();     // 使能总中断
}

void UART_TxByte(unsigned char _data)
{
    if (UCSR0A_UDRE0 == 1 && My_UART_TxBuf.number == 0)      // 数据寄存器空 且 缓冲区没有数据
    {
        UDR0 = _data;                                        // 直接发送
    }
    else
    {
        if (My_UART_TxBuf.number < (UART_TXBUF_LENGTH - 1))  // 发送缓冲区未满
        {
            My_UART_TxBuf.number++;
            My_UART_TxBuf.data[My_UART_TxBuf.tail] = _data;
            My_UART_TxBuf.tail++;
            if (My_UART_TxBuf.tail == UART_TXBUF_LENGTH)     
            {
                My_UART_TxBuf.tail = 0;
            }
        }
        else                                                 // 发送缓冲区已满
        {
            // 发送缓冲区溢出
        }
    }
}

#pragma vector = USART0_TXC_vect
__interrupt void USART0_TXC(void)
{
    if (UCSR0A_UDRE0 == 1 && My_UART_TxBuf.number > 0)       // 数据寄存器空 且 缓冲区有数据
    {
        UDR0 = My_UART_TxBuf.data[My_UART_TxBuf.head];
        My_UART_TxBuf.number--;
        My_UART_TxBuf.head++;
        if (My_UART_TxBuf.head == UART_TXBUF_LENGTH)
        {
            My_UART_TxBuf.head = 0;
        }
    }
}

#pragma vector = USART0_RXC_vect
__interrupt void USART0_RXC(void)
{
    static unsigned char temp = 0;
    temp = UDR0;
    if (My_UART_RxBuf.number < (UART_RXBUF_LENGTH - 1))      // 接收缓冲区未满
    {
        My_UART_RxBuf.data[My_UART_RxBuf.tail] = temp;
        My_UART_RxBuf.number++;
        My_UART_RxBuf.tail++;
        if (My_UART_RxBuf.tail == UART_RXBUF_LENGTH)
        {
            My_UART_RxBuf.tail = 0;
        }
    }
    else
    {
        // 接收缓冲区溢出
    }
}

  评论这张
 
阅读(1518)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018