uart接收数据处理

源文件

/*
 @bef  WTO  file  
*/

#include <stdio.h>
#include "A31G12x_int.h"
#include "A31G12x_usart1n.h"
#include "A31G12x_pcu.h"
#include "Wto_uart.h"

uint8_t Rxbuffer[RX_BUFFER_SIZE];
uint8_t Txbuffer[RX_BUFFER_SIZE];

//定义与初始化
UartHandle Usart11_Handle ={
   
 .RxHead   = 0,
 .Rxtail   = 0,
 .RxStatus = 0,
 .RxSize   = 0,
 .RxBuf    = Rxbuffer,
 .RxTim    = 0;
 .TxHead   = 0,
 .Txtail   = 0,
 .RxSize   = 0,
 .TxStatus = 0,
 .TxBuf    = Txbuffer,
};


void USART11_Receive_Data(void);
void USART11_Init(void);

struct __FILE {
    int handle; /* Add whatever needed */ };
FILE __stdout;
FILE __stdin;

int fputc(int ch, FILE *f) 
{
   
  while( UST_CheckBusy(USART11));
  UST_SendByte(USART11,ch);
  return(ch);
}

/*****************************************************************************************/
/*									串口USART											*/
/*****************************************************************************************/
void USART11_Init(void)
{
   
  UST_CFG_Type USTConfigStruct;
	
	PCU_SetDirection(PD, 3, ALTERN_FUNC);   
	PCU_ConfigureFunction(PD, 3, FUNC1);
	PCU_ConfigurePullupdown(PD,3, ENPU);

	PCU_SetDirection(PD, 2, ALTERN_FUNC);  
	PCU_ConfigureFunction(PD, 2, FUNC1);
  
	// 115200-8-无-1	
	USTConfigStruct.Mode = UST_UART_MODE;
	USTConfigStruct.Baud_rate = 115200;       
	USTConfigStruct.Databits  = UST_DATABIT_8;
	USTConfigStruct.Parity = UST_PARITY_NONE;
	USTConfigStruct.Stopbits = UST_STOPBIT_1;
  
	UST_Init(USART11, &USTConfigStruct);
	
	UST_IntConfig((USART1n_Type *)USART11, UST_INTCFG_RXC, ENABLE);
  
	NVIC_SetPriority(USART11_IRQn, 3);
	NVIC_EnableIRQ(USART11_IRQn);
	EInt_MaskDisable(UST11_MASK);
	UST_Enable(USART11, ENABLE);  
	
	__enable_irq();	
	
}


void USART11_Handler(void)
{
   
	uint32_t intsrc, tmp;	
	intsrc = UST_GetStatus(USART11);
	tmp = intsrc & UST_SR_BITMASK;  
	if ((tmp & UST_SR_RXC) == UST_SR_RXC)
	{
   
    USART11_Receive_Data();
	}  
	if ((tmp & UST_SR_TXC) == UST_SR_TXC)
	{
   
    //		 UST_ClearStatus(USART11, UST_STATUS_TXC);
	}
}

void USART11_Receive_Data(void)
{
   
  uint8_t date;
  uint32_t rLen;
  
  while(1)
  {
      
    rLen = UST_Receive((USART1n_Type *)USART11, &date, 1, NONE_BLOCKING);
    if (rLen)
    {
   
      if( 0== Usart11_Handle.RxSize ){
   
      
        Usart11_Handle.RxHead = 0;
        Usart11_Handle.Rxtail = 0;
      } 
      Usart11_Handle.RxBuf[ ++Usart11_Handle.Rxtail] = date;
     if( ++Usart11_Handle.RxSize >= RX_BUFFER_SIZE )
     {
   
        Usart11_Handle.RxSize = RX_BUFFER_SIZE;
        if( ++Usart11_Handle.RxHead >= RX_BUFFER_SIZE ){
   
              Usart11_Handle.RxHead = 0;        
        }
     }
     Usart11_Handle.RxStatus = IS_BUSY;  //  receive data now
     Usart11_Handle.RxTim = GetTickSystemTime();
    }
    else 
    {
   
      break;
    }
  }
}
//获取uart的接收状态
uint8_t GetUartRxStatus( UartHandle * pxUsart_x )
{
   
	uint32_t ticknow = GetTickSystemTime();
	if( pxUsart_x->RxStatus == IS_BUSY )
	{
   	
		if( ticknow > pxUsart_x->RxTim )
		{
   	
			if( ( ticknow - pxUsart_x->RxTim ) >= 30 ) //30ms
			{
   
				pxUsart_x->RxStatus = IS_IDLE;
			}
		} else {
   
			if( ( ( 0xffffffff - pxUsart_x->RxTim ) + ticknow ) >= 30 )
			{
   
				pxUsart_x->RxStatus = IS_IDLE;
			}
		}
	}
	return pxUsart_x->RxStatus;
}

void UsartReceiveHandle(void)
{
   
  uint8_t rxBuf[RX_BUFFER_SIZE];
  uint8_t i;
  if( GetUartRxStatus() == IS_IDLE )  //判断接收为空闲30ms时,认为接收完数据
  {
      
    printf("\ndata{");
    if( Usart11_Handle.RxSize )
    {
   
      for(i=0; i< Usart11_Handle.RxSize; i++ ){
   
      rxBuf[i] = Usart11_Handle.RxBuf[i];   
      printf("%02d ",rxBuf[i]);
      }
      printf("}");
    }
    Usart11_Handle.RxSize = 0;
    Usart11_Handle.RxHead = 0;
    Usart11_Handle.Rxtail = 0;
  }
  
}

头文件

#ifndef _WTO_UART_H_
#define _WTO_UART_H_

#define PACKET_HEADER           (3)
#define PACKET_TRAILER          (2)
#define PACKET_OVERHEAD         (PACKET_HEADER + PACKET_TRAILER)
#define PACKET_SIZE             (128)
#define PACKET_1K_SIZE          (1024)
#define RX_BUFFER_SIZE          (( PACKET_SIZE + PACKET_OVERHEAD ) * 2 )  //133*2=266 Bytes

#define IS_IDLE  0
#define IS_BUSY  1
typedef  struct{
   
uint16_t RxHead;
uint16_t Rxtail;
uint16_t RxSize;
uint32_t RxTim;
uint8_t  RxStatus;
uint8_t  *RxBuf;
uint16_t TxHead;
uint16_t Txtail;
uint16_t TxSize;
uint8_t  TxStatus;
uint8_t  *TxBuf;
}UartHandle;

extern void USART11_Init(void);
extern uint8_t GetUartRxStatus(void);
extern void UsartReceiveHandle(void);


#endif

定时器

#include "A31G12x_timer2n.h"
#include "A31G12x_timer1n.h"
#include "A31G12x_int.h"
#include "stdio.h"
uint32_t Tick1MsCounts = 0;


/**********************************************************************
  TIME20   定时5ms
 **********************************************************************/
void TIME2_Init(void)
{
   
  TIMER2_PERIODICCFG_Type T2n_Config ={
   0};

    T2n_Config.CkSel = PCLK;	// SystemPeriClock=40Mhz=PCLK   
    T2n_Config.Prescaler = 40;	// 40Mhz / 40 = 1000Khz ->1us

    T2n_Config.ADR = (1000);	// 1msec	
    T2n_Config.BDR = (0);
    T2n_Config.StartLevel=START_LOW;
    T2n_Config.TCLK_SEL = PCLK_CLK;
	
    TIMER2n_Init(T20, PERIODIC_MODE2, &T2n_Config);
    TIMER2n_IntConfig(T20, TIMER_CR_MATCH_INTR, ENABLE);

    NVIC_SetPriority(TIMER20_IRQn, 3);  //中断优先级
    NVIC_EnableIRQ(TIMER20_IRQn);
    EInt_MaskDisable(T20_MASK);

    TIMER2n_Cmd(T20, ENABLE); 
}

uint32_t GetTickSystemTime(void)
{
   
  return Tick1MsCounts;
}
void TIMER20_Handler(void)
{
   
   static uint16_t Tcnt =0;
  if ((TIMER2n_GetStatus(T20) & TIMER_CR_MATCH_FLAG) == TIMER_CR_MATCH_FLAG)
  {
   
    TIMER2n_ClearStatus(T20, TIMER_CR_MATCH_FLAG);
    Tick1MsCounts += 1;
    if(++Tcnt >= 1000)
    {
   
     Tcnt = 0;     
    }
  }        
}  

相关推荐

  1. uart接收数据处理

    2023-12-10 04:46:01       38 阅读
  2. FPGA常用通信协议 —UART(二)---UART接收

    2023-12-10 04:46:01       28 阅读
  3. STM32中usart使用DMA接受数据

    2023-12-10 04:46:01       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 04:46:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 04:46:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 04:46:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 04:46:01       18 阅读

热门阅读

  1. vue实例事件

    2023-12-10 04:46:01       34 阅读
  2. linux命令积累

    2023-12-10 04:46:01       35 阅读
  3. 如何检查mysql表里,某个字段是否存在相同值?

    2023-12-10 04:46:01       39 阅读
  4. ANSYS 有限元分析 后处理 结点解与单元解

    2023-12-10 04:46:01       43 阅读
  5. 数据库基础学习03计算机二级-第三章 数据定义

    2023-12-10 04:46:01       40 阅读