华大mcu(hcl136k8ta)串口可以发送数据,但是接收不到数据!

今天在做一个华大的串口配置的时候,一直卡在了这个问题上,串口发送没有问题(单个字节和字符串都没有问题),以下是串口的配置,串口助手调试如下图:

/***************************
串口配置
***************************/
#include "usart.h"

_UART_Rx_Data UART1_Rx_Data;

void Uart1RC_CallBackFun(void)
{
    if(Uart_GetStatus(UARTCH1,UartRC))
    {
        Uart_ClrStatus(UARTCH1,UartRC);
        Tim3_M0_Cnt16Set(Timer3_Count);
        Tim3_M0_Run();//开始计时
        if(UART1_Rx_Data.UART_Rx_Len < 512)
        {
            UART1_Rx_Data.UART_Rx_Buf[UART1_Rx_Data.UART_Rx_Len++] = Uart_ReceiveData(UARTCH1);
            printf("buf:%s\r\n",UART1_Rx_Data.UART_Rx_Buf);
        }
    }
 }

/************************
函数名称:USART_Config
函数作用:串口初始化
函数入口:brr 波特率
函数出口:无
************************/
void USART_Config(uint32_t brr)
{
    uint16_t u16Scnt = 0;
    //开启外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟
    
    //串口物理层配置
    stc_gpio_config_t GPIO_InitStructure;
    DDL_ZERO_STRUCT(GPIO_InitStructure);
    
    GPIO_InitStructure.enDir = GpioDirOut; //Tx
    Gpio_Init(GpioPortD,GpioPin0,&GPIO_InitStructure);
    Gpio_SetAfMode(GpioPortD,GpioPin0,GpioAf3);
    
    GPIO_InitStructure.enDir = GpioDirIn;  //Rx
    Gpio_Init(GpioPortD,GpioPin1,&GPIO_InitStructure);
    Gpio_SetAfMode(GpioPortD,GpioPin1,GpioAf3);
    
    //串口协议层配置
    stc_uart_config_t  UART_InitStructure;//总体配置
    stc_uart_irq_cb_t UartIrq_InitStructure;//发送接收中断处理函数接口
    stc_uart_multimode_t UartMulti_InitStructure;//多主机模式及从机地址和地址掩码配置
    stc_uart_baud_t UartBaud_InitStructure;//通道波特率计算参数
    
    DDL_ZERO_STRUCT(UART_InitStructure);
    DDL_ZERO_STRUCT(UartIrq_InitStructure);
    DDL_ZERO_STRUCT(UartMulti_InitStructure);
    DDL_ZERO_STRUCT(UartBaud_InitStructure);
    
    UartMulti_InitStructure.enMulti_mode = UartNormal;//正常工作模式
    
    UartIrq_InitStructure.pfnRxIrqCb = Uart1RC_CallBackFun;//接受中断服务函数
    
    UartBaud_InitStructure.enRunMode = UartMode1;//模式1
    UartBaud_InitStructure.u32Baud = brr;
    UartBaud_InitStructure.u32Pclk = Sysctrl_GetPClkFreq();
    
    UART_InitStructure.bTouchNvic = TRUE;//中断使能
    UART_InitStructure.enRunMode = UartMode1;//模式1
    UART_InitStructure.enStopBit = Uart1bit;//一个停止位
    UART_InitStructure.pstcIrqCb = &UartIrq_InitStructure;
    UART_InitStructure.pstcMultiMode = &UartMulti_InitStructure;
    Uart_Init(UARTCH1,&UART_InitStructure);//初始化
    Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//设置分频
    
    u16Scnt = Uart_CalScnt(UARTCH1,&UartBaud_InitStructure);//计算uart1波特率
    Uart_SetBaud(UARTCH1,u16Scnt);//设置波特率
    
    Uart_ClrIsr(UARTCH1);//清中断
    Uart_ClrStatus(UARTCH1,UartTC);//清发送完成标志位
    Uart_ClrStatus(UARTCH1,UartRC);//清接收完成标志位
    Uart_EnableIrq(UARTCH1,UartRxIrq);//使能接收中断
    Uart_EnableFunc(UARTCH1,UartRx);//使能中断服务函数
    EnableNvic(UART1_IRQn,IrqLevel1,TRUE);//中断优先级配置
}

/************************
函数名称:USART_SendByte
函数作用:串口发送字节
函数入口:byte 发送数据
函数出口:无
************************/
void USART_SendByte(uint8_t byte)
{
    Uart_SendData(UARTCH1,byte);
}

/************************
函数名称:USART_RecByte
函数作用:串口接收字节
函数入口:无
函数出口:byte 接收数据
************************/
uint8_t USART_RecByte(void)
{
    uint8_t byte = 0;
    while(Uart_GetStatus(UARTCH1,UartRC) == FALSE); //直到接收完成
    byte = Uart_ReceiveData(UARTCH1);
    return byte;
}

/************************
函数名称:USART_SendStr
函数作用:USART发送字符串--查询
函数入口:str 发送字符串 
          Length 长度
函数出口:无
************************/
void USART_SendStr(char* str,uint32_t Length)
{
    uint8_t i = 0;
    for(i=0;i<Length;i++)
    {
        Uart_SendData(UARTCH1,*str);
        str++;
    }
        
}

/************************
函数名称:USART_Echo
函数作用:USART回显
函数入口:无
函数出口:无
************************/
void USART_Echo(void)
{
    uint8_t byte;
    byte = USART_RecByte();
    USART_SendByte(byte);
}

/************************
函数名称:fputc
函数作用:printf重定义
函数入口:无
函数出口:无
************************/
int fputc(int c, FILE *stream)
{
    USART_SendByte(c);
    return c;
}

下图1
把回显函数放到主函数中运行没有任何现象,(一般在调试串口的时候我都会写一个回显函数来判断串口是否调通)
debug调试如下图(断点在回显之前,还没进入函数)
下图2
debug下一步进入函数(串口助手上发送了一个 2 ),此时现象如下图
下图3
按照常理来说,2 应该在上位机上显示出来才对呀,为什么没有显示呢?发送函数是通的,说明是接收出了问题,然后debug单步运行,好像是卡在了这里
下图4
行吧,我蒙圈了,还请各位能给出宝贵意见!

问题已解决。程序没有问题,只是用了别人修改过的库函数写的程序,有些内容和官方库是有差异的。建议在写工程的时候直接到官网上找官方mdk使用!!!
至于buf里出现0x0a的问题,是因为在上位机上选择了“发送新行”选项,该选项去掉后,sbuf中数据正常

img

img

img

img