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

耳朵的博客

做自己想做的人

 
 
 

日志

 
 

AVR 串口收发 使用循环链表实现的程序源代码  

2010-10-14 23:11:05|  分类: AVR |  标签: |举报 |字号 订阅

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

关键代码:
UART.h:
/********** 串口收发循环链表实现 **********
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: ATmega128
* 文件名.......: UART.h
* 编译器.......: IAR for AVR V5.5
* 创建时间.....: 2010.10.14
* 最后修改.....: 2010.10.14
******************************************/
#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

struct UART_BUF
{
    volatile unsigned char data;
    volatile struct UART_BUF *next;
};

extern void UART_Init(void);
extern void UART_TxByte(unsigned char _data);
extern void _enable_uart_interrupt(void);
extern void _disable_uart_interrupt(void);

extern volatile struct UART_BUF UART_TxBuf[UART_TXBUF_LENGTH], UART_RxBuf[UART_RXBUF_LENGTH];
extern volatile struct UART_BUF *p_TxBuf_Head, *p_TxBuf_Tail, *p_RxBuf_Head, *p_RxBuf_Tail;


#endif /* __UART_H__ */

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

volatile struct UART_BUF UART_TxBuf[UART_TXBUF_LENGTH], UART_RxBuf[UART_RXBUF_LENGTH];
volatile struct UART_BUF *p_TxBuf_Head, *p_TxBuf_Tail, *p_RxBuf_Head, *p_RxBuf_Tail;

void UART_Init(void)
{
    UBRR0L = (F_CPU / 16L / UART_BAUD - 1);
    UCSR0B_RXEN0 = 1;
    UCSR0B_TXEN0 = 1;
    UCSR0B_RXCIE0 = 1;
    UCSR0B_TXCIE0 = 1;

    unsigned int i = 0;
    // 
    for (i = 0i < UART_TXBUF_LENGTH - 1i++)
    {
        UART_TxBuf[i].next = &UART_TxBuf[i + 1];
    }
    UART_TxBuf[UART_TXBUF_LENGTH - 1].next = &UART_TxBuf[0];
    p_TxBuf_Head = &UART_TxBuf[0];
    p_TxBuf_Tail = &UART_TxBuf[0];
    //
    for (i = 0i < UART_RXBUF_LENGTH - 1i++)
    {
        UART_RxBuf[i].next = &UART_RxBuf[i + 1];
    }
    UART_RxBuf[UART_RXBUF_LENGTH - 1].next = &UART_RxBuf[0];
    p_RxBuf_Head = &UART_RxBuf[0];
    p_RxBuf_Tail = &UART_RxBuf[0];

    __enable_interrupt();
}

void UART_TxByte(unsigned char _data)
{
    if (UCSR0A_UDRE0 == 1 && p_TxBuf_Head == p_TxBuf_Tail)
    {
        UDR0 = _data;
    }
    else
    {
        if (p_TxBuf_Tail->next != p_TxBuf_Head)
        {
            p_TxBuf_Tail->data = _data;
            p_TxBuf_Tail = p_TxBuf_Tail->next;
        }
    }
}

void _enable_uart_interrupt(void)
{
    UCSR0B_RXCIE0 = 1;
    UCSR0B_TXCIE0 = 1;
}

void _disable_uart_interrupt(void)
{
    UCSR0B_RXCIE0 = 0;
    UCSR0B_TXCIE0 = 0;
}

#pragma vector = USART0_TXC_vect
__interrupt void USART0_TXC(void)
{
    if (UCSR0A_UDRE0 == 1 && p_TxBuf_Head != p_TxBuf_Tail)
    {
        UDR0 = p_TxBuf_Head->data;
        p_TxBuf_Head = p_TxBuf_Head->next;
    }
}

#pragma vector = USART0_RXC_vect
__interrupt void USART0_RXC(void)
{
    if (p_RxBuf_Tail->next != p_RxBuf_Head)
    {
        p_RxBuf_Tail->data = UDR0;
        p_RxBuf_Tail = p_RxBuf_Tail->next;
    }
}


效果截图:
发送了一个文件
AVR 串口收发 使用循环链表实现的程序源代码 - 耳朵 - 耳朵的博客
 
  评论这张
 
阅读(1025)| 评论(1)
推荐 转载

历史上的今天

评论

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

页脚

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