📄 uart.c
字号:
/*
**********************************Copyright (c) ****************************
* cwg
* All Rights Reserved
* QQ:7084394
*
*---------------------------------File Info---------------------------------
*File Name :uart.c
*Descriptor :
*Create By :ChenWeiGuo
*Create Date :2006-9-24
*Version :V1.0
*Note :
*
*---------------------------------------------------------------------------
*Modified By :
*Modified Date :
*Version :
*Note :
*
****************************************************************************
*/
#define _IN_UART_
#include "config.h"
uint8 Rx1Buffer[USART_RX_BUFFER_SIZE];
uint8 Tx1Buffer[USART_TX_BUFFER_SIZE];
uint16 Rx1Head = 0, Tx1Head = 0;
uint16 Rx1Tail = 0, Tx1Tail = 0;
/***************************************************************************
*Function Name :InitUart
*Description :
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :ChenWeiGuo
*Create Tate :2007-4-27
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
void InitUart(void)
{
//Communication Parameters: 8 Data, 1 Stop, No Parity
//USART Receiver: On
//USART Transmitter: On
//USART Mode: Asynchronous
//USART Baud rate: 38400
UCSR1A = 0x00;
UCSR1B = 0xD8;
UCSR1C = 0x06;
UBRR1H = 0x00;
UBRR1L = 0x0C;
}
/***************************************************************************
*Function Name
*Description :
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :ChenWeiGuo
*Create Tate :2007-4-27
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
#pragma optimize=z 4
AVRX_SIGINT(SIG_UART1_RECV)//串口接收中断函数
{
/*接收到数据*/
IntProlog(); //切换到系统堆栈
Rx1Buffer[Rx1Tail] = UDR1;
IncRxPtr(Rx1Tail); //调整尾巴
Epilog(); //返回任务堆栈
}
/***************************************************************************
*Function Name
*Description :
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :ChenWeiGuo
*Create Tate :2007-4-27
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
#pragma optimize=z 4
AVRX_SIGINT(SIG_UART1_TRANS) //串口发送中断函数
{
//发送完数据
IntProlog(); //切换到系统堆栈
if(Tx1Tail != Tx1Head)
{
UDR1 = Tx1Buffer[Tx1Head];
IncTxPtr(Tx1Head); //调整为下一次的头指针
}
Epilog(); //返回任务堆栈
}
/***************************************************************************
*Function Name :GetUart1Data
*Description :
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :ChenWeiGuo
*Create Tate :2006-9-24
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
uint8 GetUart1Data(uint8 *pbyData)
{
//读取串口接收缓存区一字节数据
if(Rx1Tail != Rx1Head)
{ /*缓冲区中有数据*/
*pbyData = Rx1Buffer[Rx1Head]; //取出第一个数据
IncRxPtr(Rx1Head); //调整为下一次的头指针
return(OK);
}
else
{
return(ERROR);
}
}
/***************************************************************************
*Function Name :PutUart1Data
*Description :
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :ChenWeiGuo
*Create Tate :2006-9-24
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
uint8 PutUart1Data(uint8 byData)
{
Tx1Buffer[Tx1Tail] = byData; //数据入缓冲区
IncTxPtr(Tx1Tail); //调整为下一次的头指针
if(Tx1Tail != Tx1Head) //缓冲区没有满
{
return(OK);
}
else
{
return(ERROR);
}
}
/***************************************************************************
*Function Name :StartUart1Send
*Description :
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :ChenWeiGuo
*Create Tate :2007-4-27
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
void StartUart1Send(void)
{
while(!(UCSR1A & (1 << UDRE1))); //等待发送缓冲区空
UDR1 = Tx1Buffer[Tx1Head];
IncTxPtr(Tx1Head); //调整为下一次的头指针
return;
}
/***************************************************************************
*Function Name :SendUart1String
*Description :
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :ChenWeiGuo
*Create Tate :2006-9-24
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
uint8 SendUart1String(uint8 *pbyData, uint16 uiLen) // 发送一数据帧包;
{
if(uiLen == 0) //数据长度错误
{
return(ERROR);
}
while(uiLen-- != 0)
{
if(PutUart1Data(*pbyData++) == ERROR)
{ //发送数据帧超过缓冲区大小
return(ERROR);
}
}
StartUart1Send(); //启动数据发送
return(OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -