//
//
/****************************************************************************************
** 文件名称: uart.c
** 功能描述: 
** 参    数: None
** 返 回 值: None
** 作　  者: 汪仁海QQ527148813
** 日  　期: 2013年4月23日
**---------------------------------------------------------------------------------------
** 修 改 人:
** 日　  期:
**---------------------------------------------------------------------------------------
*****************************************************************************************/ 

#ifndef __MY_UART_C
#define __MY_UART_C

#ifdef __cplusplus
 extern "C" {
#endif	 
#include "myuart.h"	 

USART_R_T_DATA    myUSART1_data;
	 
//UART相关初始化
void UART_Init(void)
{
	uint16_t i=0;
	//串口1数据初始化话*****************************************************************
	myUSART1_data.usart_rx_data[0]=0;
	
	for(i=0;i<USART_RX_NUM;i++)
    	myUSART1_data.usart_rx[i]=0;    
	myUSART1_data.usart_rx_len=0;
	myUSART1_data.usart_rx_time=0;
	
	for(i=0;i<USART_TX_NUM;i++)
    	myUSART1_data.usart_tx[i]=0;
	myUSART1_data.usart_tx_len=0;
	myUSART1_data.usart_tx_sp=0;
	myUSART1_data.usart_tx_finish=0;
	myUSART1_data.usart_tx_flag=0;
	myUSART1_data.usart_flag=0;
	
	//启动数据接收*
	HAL_UART_Receive_IT(&huart1, myUSART1_data.usart_rx_data,1);//开启接收中断，接收1字节
}

void myUSART_OverTime(void)  //串口接收超时处理
{
	//串口1接收数据超时处理*******************
	if(myUSART1_data.usart_rx_time<5000)
	{
		myUSART1_data.usart_rx_time++;
	}
}

void myUSART_putChar(uint8_t ch)  //发送一个字节 
{
//	if(huart==&huart1)//串口1
	{
		if(myUSART1_data.usart_tx_finish==0)
		{
			myUSART1_data.usart_tx_finish=1;
			HAL_UART_Transmit_IT(&huart1, &ch, 1);
		}
	}
}

void myUSART_putData(uint8_t dat[],uint16_t ch)//发送指定长度的数组
{
//	if(huart==&huart1)//串口1
	{
		if(myUSART1_data.usart_tx_finish==0)
		{
			myUSART1_data.usart_tx_finish=1;
			for(uint16_t i=0;i<ch;i++)
			{
				myUSART1_data.usart_tx[i]=dat[i];			
			}
			HAL_UART_Transmit_IT(&huart1, (uint8_t *)myUSART1_data.usart_tx, ch);
		}
	}	
}



/**
  * @brief  Rx Transfer completed callback
  * @param  UartHandle: UART handle
  * @note   This example shows a simple way to report end of DMA Rx transfer, and 
  *         you can add your own implementation.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
//	/* Prevent unused argument(s) compilation warning */
  UNUSED(UartHandle);
//  /* Set transmission flag: transfer complete */
	if(UartHandle==&huart1)//串口1
	{
		//数据超时处理
		if(myUSART1_data.usart_rx_time>200)//指令超时复位
		{
			myUSART1_data.usart_rx_time=0;
			myUSART1_data.usart_rx_len=0;
		}
		
		//保存接收的数据
		if(myUSART1_data.usart_rx_len<USART_RX_NUM)
		{
			myUSART1_data.usart_rx[myUSART1_data.usart_rx_len]=myUSART1_data.usart_rx_data[0];
			
			if(myUSART1_data.usart_rx[myUSART1_data.usart_rx_len] == '1')
			{
				keyflag =1;
			}
			else if(myUSART1_data.usart_rx[myUSART1_data.usart_rx_len] == '2')
			{
				keyflag =2;
			}
			myUSART1_data.usart_rx_len++;			 
		}
		
//		//判断非帧头处理
//		if((myUSART1_data.usart_rx_len==1)&(myUSART1_data.usart_rx[0]!=0xAA))
//		{
//			myUSART1_data.usart_rx_len=0;
//		}		
//		else if((myUSART1_data.usart_rx_len==2)&(myUSART1_data.usart_rx[1]!=0xAA))
//		{
//				myUSART1_data.usart_rx_len=0;	
//		}			
		myUSART1_data.usart_rx_len=0;
		//清时间计数
		myUSART1_data.usart_rx_time=0;
			
		//重新启动数据接收********************
		HAL_UART_Receive_IT(&huart1, myUSART1_data.usart_rx_data,1);//继续开启接收中断，接收1字节		
	}  
}

void myUSART_handle(void)	//串口接收任务协议解析
{
	if(myUSART1_data.usart_rx_time>10)	//指令间隔达到指定值为一帧结束,做协议解析
	{
		//测试，返回指令
		{
			myUSART_putData(myUSART1_data.usart_rx,myUSART1_data.usart_rx_len);//发送指定长度的数组
			myUSART1_data.usart_rx_len=0;
			myUSART1_data.usart_rx_time=0;
		}
	}	
}

/**
  * @brief  Tx Transfer completed callback
  * @param  UartHandle: UART handle. 
  * @note   This example shows a simple way to report end of IT Tx transfer, and 
  *         you can add your own implementation. 
  * @retval None
  */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  /* Set transmission flag: transfer complete */
	if(UartHandle==&huart1)//串口1
	{
		myUSART1_data.usart_tx_len=0;
		myUSART1_data.usart_tx_sp=0;
		myUSART1_data.usart_tx_finish=0;
		myUSART1_data.usart_tx_flag=0;
	}  
}
/**
  * @brief  UART error callbacks
  * @param  UartHandle: UART handle
  * @note   This example shows a simple way to report transfer error, and you can
  *         add your own implementation.
  * @retval None
  */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle)
{
    Error_Handler();
}


#ifdef __cplusplus
}
#endif
#endif /*__MY_UART_C */

