AVR 串口收發(fā) 使用循環(huán)鏈表實現(xiàn)的程序源代碼
http://www.rayfile.com/files/062cd042-d7a5-11df-8a51-0015c55db73d/
關鍵代碼:
UART.h:
/********** 串口收發(fā)循環(huán)鏈表實現(xiàn) **********
* 版本.........: 1.0
* 作者.........: 陳利棟
* 目標.........: ATmega128
* 文件名.......: UART.h
* 編譯器.......: IAR for AVR V5.5
* 創(chuàng)建時間.....: 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
structUART_BUF
{
volatileunsignedchardata;
volatilestructUART_BUF*next;
};
externvoidUART_Init(void);
externvoidUART_TxByte(unsignedchar_data);
externvoid_enable_uart_interrupt(void);
externvoid_disable_uart_interrupt(void);
externvolatilestructUART_BUFUART_TxBuf[UART_TXBUF_LENGTH],UART_RxBuf[UART_RXBUF_LENGTH];
externvolatilestructUART_BUF*p_TxBuf_Head,*p_TxBuf_Tail,*p_RxBuf_Head,*p_RxBuf_Tail;
#endif/* __UART_H__ */
* 版本.........: 1.0
* 作者.........: 陳利棟
* 目標.........: ATmega128
* 文件名.......: UART.h
* 編譯器.......: IAR for AVR V5.5
* 創(chuàng)建時間.....: 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
structUART_BUF
{
volatileunsignedchardata;
volatilestructUART_BUF*next;
};
externvoidUART_Init(void);
externvoidUART_TxByte(unsignedchar_data);
externvoid_enable_uart_interrupt(void);
externvoid_disable_uart_interrupt(void);
externvolatilestructUART_BUFUART_TxBuf[UART_TXBUF_LENGTH],UART_RxBuf[UART_RXBUF_LENGTH];
externvolatilestructUART_BUF*p_TxBuf_Head,*p_TxBuf_Tail,*p_RxBuf_Head,*p_RxBuf_Tail;
#endif/* __UART_H__ */
UART.c:
/********** 串口收發(fā)循環(huán)鏈表實現(xiàn) **********
* 版本.........: 1.0
* 作者.........: 陳利棟
* 目標.........: ATmega128
* 文件名.......: UART.c
* 編譯器.......: IAR for AVR V5.5
* 創(chuàng)建時間.....: 2010.10.14
* 最后修改.....: 2010.10.14
******************************************/
#include "UART.h"
volatilestructUART_BUFUART_TxBuf[UART_TXBUF_LENGTH],UART_RxBuf[UART_RXBUF_LENGTH];
volatilestructUART_BUF*p_TxBuf_Head,*p_TxBuf_Tail,*p_RxBuf_Head,*p_RxBuf_Tail;
voidUART_Init(void)
{
UBRR0L=(F_CPU/16L/UART_BAUD-1);
UCSR0B_RXEN0=1;
UCSR0B_TXEN0=1;
UCSR0B_RXCIE0=1;
UCSR0B_TXCIE0=1;
unsignedinti=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();
}
voidUART_TxByte(unsignedchar_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
__interruptvoidUSART0_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
__interruptvoidUSART0_RXC(void)
{
if(p_RxBuf_Tail->next!=p_RxBuf_Head)
{
p_RxBuf_Tail->data=UDR0;
p_RxBuf_Tail=p_RxBuf_Tail->next;
}
}
* 版本.........: 1.0
* 作者.........: 陳利棟
* 目標.........: ATmega128
* 文件名.......: UART.c
* 編譯器.......: IAR for AVR V5.5
* 創(chuàng)建時間.....: 2010.10.14
* 最后修改.....: 2010.10.14
******************************************/
#include "UART.h"
volatilestructUART_BUFUART_TxBuf[UART_TXBUF_LENGTH],UART_RxBuf[UART_RXBUF_LENGTH];
volatilestructUART_BUF*p_TxBuf_Head,*p_TxBuf_Tail,*p_RxBuf_Head,*p_RxBuf_Tail;
voidUART_Init(void)
{
UBRR0L=(F_CPU/16L/UART_BAUD-1);
UCSR0B_RXEN0=1;
UCSR0B_TXEN0=1;
UCSR0B_RXCIE0=1;
UCSR0B_TXCIE0=1;
unsignedinti=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();
}
voidUART_TxByte(unsignedchar_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
__interruptvoidUSART0_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
__interruptvoidUSART0_RXC(void)
{
if(p_RxBuf_Tail->next!=p_RxBuf_Head)
{
p_RxBuf_Tail->data=UDR0;
p_RxBuf_Tail=p_RxBuf_Tail->next;
}
}
效果截圖:
發(fā)送了一個文件
評論