整个工程下载:
http://www.rayfile.com/files/062cd042-d7a5-11df-8a51-0015c55db73d/
关键代码:
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
#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 = 0; i
{
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 = 0; i
{
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;
}
}
效果截图:
发送了一个文件
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』