📄 uart2.c
字号:
/**********************************************************************
* System Name DOOR
* Source Name uart2.c
* Function dip sw状态输入
* Version Date Editor Modification
* 1.0 2007/05/10 周斌 做成
**********************************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "global.h"
#include "uart2.h"
#include "spi_to_uart.h"
#include "timer0.h"
#define UART2_RX 0
#define UART2_TX 1
#define UART2_FREE 2
UCHAR uart2_stat = UART2_FREE;
//uart 0 缓存大小配置
#define uart2_RX_BUF_SIZE 128
#define uart2_TX_BUF_SIZE 128
//uart 0 缓存区
volatile UCHAR uart2_rx_buf_data[uart2_RX_BUF_SIZE]; //接收缓存
volatile UCHAR uart2_rx_buf_head; //头指针
volatile UCHAR uart2_rx_buf_tail; //尾指针
volatile UCHAR uart2_rx_buf_len; //长度
//
volatile UCHAR uart2_tx_buf_data[uart2_TX_BUF_SIZE]; //发送缓存
volatile UCHAR uart2_tx_buf_head; //头指针
volatile UCHAR uart2_tx_buf_tail; //尾指针
volatile UCHAR uart2_tx_buf_len; //长度
extern volatile UCHAR MAX3100_T_FLAG;
UCHAR TX_INT_FLAG;
UCHAR RX_INT_FLAG;
/**********************************************************************
* Function Name uart2_init
* Function Desc 串口0初始化
* Return Value 无
* Parameter
t_ubbr:波特率配置选择
* Version Date Editor Modification
* 1.0 2007/05/09 周斌 做成
**********************************************************************/
void uart2_init(void)
{
max3100_init();
//
uart2_rx_buf_head = 0;
uart2_rx_buf_tail = 0;
uart2_rx_buf_len = 0;
//
uart2_tx_buf_head = 0;
uart2_tx_buf_head = 0;
uart2_tx_buf_len = 0;
PORTD |= 0x01;
sei();
}
/**********************************************************************
* Function Name uart2_put_byte
* Function Desc 通过串口0发送一个字节
* Return Value 无
* Parameter
t_char 要发送的字符
* Version Date Editor Modification
* 1.0 2007/05/09 周斌 做成
**********************************************************************/
UCHAR uart2_put_byte(UCHAR t_char)
{
//暂停中断,以免数据比较时出错
cli();
if(uart2_tx_buf_len < uart2_TX_BUF_SIZE)
{
uart2_tx_buf_data[uart2_tx_buf_tail] = t_char;
uart2_tx_buf_tail++;
//指针到了底部回顶部
if (uart2_tx_buf_tail >= uart2_TX_BUF_SIZE)
{
uart2_tx_buf_tail = 0;
}
uart2_tx_buf_len++;
return TRUE;
}
else
{
error_code = ERROR_UART2_TX;
return FALSE;
}
sei();
}
/**********************************************************************
* Function Name uart2_get_byte
* Function Desc 从串口2的缓存中取一个字节
* Return Value
* SUCESS: 取字节成功
* FAIL: 取字节失败
* Parameter
*t_char 取字节地址
* Version Date Editor Modification
* 1.0 2007/05/10 史玮 做成
**********************************************************************/
UCHAR uart2_get_byte(UCHAR * t_char)
{
if(uart2_rx_buf_len>0)
{
cli();
*t_char = uart2_rx_buf_data[uart2_rx_buf_head];
uart2_rx_buf_head++;
//指针到末尾后回到开始
if(uart2_rx_buf_head>=uart2_RX_BUF_SIZE)
{
uart2_rx_buf_head=0;
}
uart2_rx_buf_len--;
sei();
return SUCESS;
}
else
{
return FAIL;
}
}
/**********************************************************************
* Function Name uart2_put_bytes
* Function Desc 通过串口0发送len个字节
* Return Value 无
* Parameter
pBytes 要发送的数据的首地址
len 数据长度
* Version Date Editor Modification
* 1.0 2007/05/09 史玮 做成
**********************************************************************/
void uart2_put_bytes(UCHAR * pBytes,UCHAR len)
{
UCHAR i;
for(i=0;i<len;i++)
{
uart2_put_byte(*(pBytes+i));
}
}
/**********************************************************************
* Function Name uart2_get_buffer_len()
* Function Desc 获取缓冲区数据长度
* Return Value 缓冲区数据长度
* Parameter
* Version Date Editor Modification
* 1.0 2007/05/09 史玮 做成
**********************************************************************/
UCHAR uart2_get_buffer_len()
{
return uart2_rx_buf_len;
}
/**********************************************************************
* Function Name uart2_clear_buffer()
* Function Desc 清缓冲区
* Return Value
* Parameter
* Version Date Editor Modification
* 1.0 2007/05/09 史玮 做成
**********************************************************************/
void uart2_clear_buffer()
{
uart2_rx_buf_tail = uart2_rx_buf_head ;
uart2_rx_buf_len = 0; //长度=0
}
//串口2中断
/**********************************************************************
* Function Name uart2中断
* Parameter
*t_char 取字节地址
* Version Date Editor Modification
* 1.0 2007/05/10 史玮 做成
**********************************************************************/
/*
#ifdef int_test1
#define
SIGNAL(SIG_INTERRUPT0)
{
// volatile UCHAR RX_DATA[2];
cli();
//temp[0] = RX_DATA[0];
//temp[1] = RX_DATA[1];
max3100_read_data(temp); //分析中断类型
if(temp[0] & 0x80)//有数据到来
{
RX_INT_FLAG = 1;
}
if(MAX3100_T_FLAG == 1 && (temp[0] &0x40))
{//发送完成中断
//max3100_read_data(RX_DATA);
TX_INT_FLAG = 1;
}
sei();
}
void uart2_int_process(void)
{
extern UINT N;
if(RX_INT_FLAG == 1)
{
do
{
if(uart2_rx_buf_len < uart2_RX_BUF_SIZE)
{
uart2_rx_buf_data[uart2_rx_buf_tail] = temp[1];
uart2_rx_buf_tail++;
//指针到末尾后回到开始
if(uart2_rx_buf_tail >= uart2_RX_BUF_SIZE)
{
uart2_rx_buf_tail = 0;
}
uart2_rx_buf_len++;
N++;
}
cli();
max3100_read_data(temp);
sei();
}while(temp[0] & 0x80);
RX_INT_FLAG = 0;
}
if(TX_INT_FLAG == 1)
{
MAX3100_T_FLAG = 0;
if (uart2_tx_buf_len>0) //如果发送缓存中有数据
{
max3100_write_data(uart2_tx_buf_data[uart2_tx_buf_head]);
uart2_tx_buf_head++;
//指针到了底部回顶部
if (uart2_tx_buf_head >= uart2_TX_BUF_SIZE)
{
uart2_tx_buf_head = 0;
}
uart2_tx_buf_len--; //缓存长度--
}
// P++;
//max3100_read_data(temp);//清楚IRQ
TX_INT_FLAG = 0;
//P++;
}
}
*/
SIGNAL(SIG_INTERRUPT0)
{
EIMSK &= ~(1<<INT0); //DISABLE INT0
uart2_stat = UART2_RX;
}
/**********************************************************************
* Function Name uart2_rx_process
* Function Desc 把数据从3100接收缓冲搬移到uart2接收缓存
* Return Value 无
* Parameter 无
* Version Date Editor Modification
* 1.0 2007/05/14 周斌 做成
**********************************************************************/
void uart2_rx_process(void)
{
volatile UCHAR temp[2];
// UCHAR t_int[1];
// UCHAR inter0;
// UCHAR count = 0;
UCHAR data_exist = TRUE;
if(uart2_stat == UART2_RX)
{
while(data_exist == TRUE)
{
max3100_read_data(temp); //分析中断类型
if(temp[0] & 0x80)//有数据到来
{
//
data_exist = TRUE;
//
if(uart2_rx_buf_len < uart2_RX_BUF_SIZE)
{
uart2_rx_buf_data[uart2_rx_buf_tail] = temp[1];
uart2_rx_buf_tail++;
//指针到末尾后回到开始
if(uart2_rx_buf_tail >= uart2_RX_BUF_SIZE)
{
uart2_rx_buf_tail = 0;
}
uart2_rx_buf_len++;
//N++;
timer0_task_uart2pack_stat = TIMER0_TASK_UART2PACK_NEW;
}
}
else
{
data_exist = FALSE;
uart2_stat = UART2_FREE;
EIMSK |= (1<<INT0); //ENABLE INT0
}
}
}
}
/**********************************************************************
* Function Name uart2_put_byte_process
* Function Desc 把数据从uart2发送缓存发送到发送3100缓冲
* Return Value 无
* Parameter 无
* Version Date Editor Modification
* 1.0 2007/05/14 周斌 做成
**********************************************************************/
void uart2_put_byte_process(void)
{
UCHAR temp[2];
UCHAR stat_return; //发送数据的同时返回的状态
if(uart2_stat == UART2_FREE)
{
if(uart2_tx_buf_len > 0) //如果缓存有数据
{
max3100_read_config(temp); //查询发送缓冲是否为空
if (temp[0] & 0x40) //如果发送缓冲为空
{
stat_return = max3100_write_data(uart2_tx_buf_data[uart2_tx_buf_head]); //直接发送数据
//
if( (stat_return & 0x80 )==0x80)
{
uart2_stat = UART2_RX;
}
cli();
uart2_tx_buf_head++;
if (uart2_tx_buf_head >= uart2_TX_BUF_SIZE)
{
uart2_tx_buf_head = 0;
}
//
uart2_tx_buf_len--;
sei();
}
}
}
}
/**********************************************************************
* Function Name uart2_put_string
* Function Desc 通过串口1发送一个字符串
* Return Value 无
* Parameter
* *p_str 字符串首指针
* Version Date Editor Modification
* 1.0 2007/05/09 周斌 做成
**********************************************************************/
void uart2_put_string(char * p_str)
{
for(;*p_str!=0;p_str++) //遇到停止符0结束
{
uart2_put_byte(*p_str);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -