This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

串口UART1接收数据帧的问题

开发中遇到的问题,暂时没能查出原因,求助TI专家。

芯片型号:TM4C123FH6PMI

问题描述:UART1接收上位机发来的数据帧(长度大于16字节),只有前16字节能正确接收,超过16字节的部分不能被接收。波特率:460800

下面是UART1初始化部分代码:

/**********串口1初始化函数**********/
//参数:baud-波特率
//返回:无
//备注:串口1用于与上位机的通信
void USART1_Init(uint32_t baud)
{
	/*开启GPIOC与UART1时钟*/
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
	
	/*配置PC4、PC5管脚映射为UART1的RX和TX*/
	ROM_GPIOPinConfigure(GPIO_PC4_U1RX);  
	ROM_GPIOPinConfigure(GPIO_PC5_U1TX);  
	
	/*配置PC4、PC5管脚为串口所需的模式*/
	ROM_GPIOPinTypeUART(GPIO_PORTC_BASE,GPIO_PIN_4|GPIO_PIN_5);
	
	/*配置UART1的时钟源为内部精确振荡器*/
	ROM_UARTClockSourceSet(UART1_BASE,UART_CLOCK_PIOSC);
	
	/*使能FIFO*/
	ROM_UARTFIFOEnable(UART1_BASE);
	
	/*关闭硬件流控*/
	UARTFlowControlSet(UART1_BASE,UART_FLOWCONTROL_NONE);
	
	/*为串口1提供控制台输入输出函数的支持,串口1时钟频率为16MHz*/
	UARTStdioConfig(1,baud,16000000);
	
	/*使能UART1*/
	ROM_UARTEnable(UART1_BASE);
	
	/*如果对串口1使用DMA方式*/
	#ifdef SEND_USE_DMA
	
	/*设置串口1产生DMA请求的条件,当发送(接收)FIFO中的数据少于(多于)其容量的1/8时产生DMA请求*/
	ROM_UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX1_8,UART_FIFO_RX1_8);
	
	/*使能串口1的DMA操作*/
	ROM_UARTDMAEnable(UART1_BASE,UART_DMA_TX);
	
	#endif
	
	UARTprintf("UART1 initilization completed!\n");
}

下面是非中断接收数据帧部分的代码

/*接收帧缓冲区*/
volatile uint8_t received_frame[50];

/**********接收一帧数据并解析函数**********/
//参数:无
//返回:无
//备注:
void Receive_Data(void)
{
	uint8_t volatile i,sum = 0,num;
	
	/*如果接收到数据,即串口接收FIFO非空*/
	if(ROM_UARTCharsAvail(UART1_BASE) == true)
	{
		/*帧头*/
		received_frame[0] = (uint8_t)UARTCharGet(UART1_BASE);
		received_frame[1] = (uint8_t)UARTCharGet(UART1_BASE);
		
		/*功能字*/
		received_frame[2] = (uint8_t)UARTCharGet(UART1_BASE); 
		
		/*帧长(只包括有效数据部分)*/
		received_frame[3] = (uint8_t)UARTCharGet(UART1_BASE); 
		
		/*总帧长,即该帧的总字节数*/
		num = received_frame[3]+5;
		
		/*根据帧长接收余下的字节*/
		for(i = 4;i<num;i++)
			received_frame[i] = (uint8_t)UARTCharGet(UART1_BASE); 

		/*如果帧头不符,则不对这一帧进行解析*/
		if((received_frame[0] != 0xAA)||(received_frame[1] != 0xAF))
			return;
		
		/*计算校验和*/
		for(i = 0;i<(num-1);i++)
			sum += received_frame[i];
		
		/*如果校验和不符,则不对这一帧进行解析*/
		if(sum != received_frame[num-1])
			return;

在线DEBUG观察received_frame数组的内容,发现0-15字节正常,而后面的几个字节却是下一帧的内容,从而导致校验和不正确。请不吝赐教。