单片小菜 发表于 2023-1-5 10:38

HC32F005串口的问题??

我只是想实现一下串口的收发,准确无误,为什么这么难?波特率为9600,外部晶振8M。
附上代码:

int32_t main(void)

{
    ///< UART 端口初始化
    App_PortInit();

    ///< UART 初始化
    App_UartInit();

    while(1)
        {
                Check** = 0;
                if(u8Rx**)
                {
                        u8Rx** = 0;
//                        if(Uart_CheckEvenOrOdd(M0P_UART1,UartEven,u8RxData)!=Ok)
//                        {
//                                Check** = 1;//奇偶校验出错
//                        }
//                        else
//                        {
//                                Uart_SetTb8(M0P_UART1,UartEven,u8RxData);
                                Uart_SendDataPoll(M0P_UART1,u8RxData);
//                                Uart_SetTb8(M0P_UART1,UartEven,u8RxData);
                                Uart_SendDataPoll(M0P_UART1,u8RxData);
//                        }
                }
        }
}///< UART1 中断服务函数
void Uart1_IRQHandler(void)
{
          
    if(TRUE == Uart_GetStatus(M0P_UART1, UartRC))
    {
      Uart_ClrStatus(M0P_UART1, UartRC);

      u8RxData = Uart_ReceiveData(M0P_UART1);
      u8Rx** = 1;
                       
//                          ucTemp= Uart_ReceiveData(M0P_UART1);
//                          Get_usart1_data(ucTemp);

    }

}static void _UartBaudCfg(void)
{
    uint16_t timer=0;

    stc_uart_baud_cfg_t stcBaud;
    stc_bt_cfg_t stcBtCfg;

    DDL_ZERO_STRUCT(stcBaud);
    DDL_ZERO_STRUCT(stcBtCfg);

    //外设时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralBt,TRUE);//模式0/2可以不使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);

    stcBaud.bDbaud= 0u;//双倍波特率功能
    stcBaud.u32Baud = 9600u;//更新波特率位置
    stcBaud.enMode= UartMode3; //计算波特率需要模式参数
    stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); //获取PCLK
    timer = Uart_SetBaudRate(M0P_UART1, &stcBaud);

    stcBtCfg.enMD = BtMode2;
    stcBtCfg.enCT = BtTimer;
    Bt_Init(TIM1, &stcBtCfg);//调用basetimer1设置函数产生波特率
    Bt_ARRSet(TIM1,timer);
    Bt_Cnt16Set(TIM1,timer);
    Bt_Run(TIM1);

}   我们看看串口调试助手的回复。


      我想知道你们是咋搞的?

hulai123456 发表于 2023-1-5 11:04

//while循环中:
while(1)
{
uint8_t i;
        check** =0 ;

if(u8Rx**)
{
        for(i=0;i<u8Rx**;i++)
        {
                Uart_SendDataPoll(M0P_UART1,u8RxData);
        }
}
u8Rx**=0;
}



//UART1中断服务程序中:
    if(TRUE == Uart_GetStatus(M0P_UART1, UartRC))
    {
      Uart_ClrStatus(M0P_UART1, UartRC);

      u8RxData = Uart_ReceiveData(M0P_UART1);

      u8Rx**++;
    }

hulai123456 发表于 2023-1-5 11:14

上述代码中
while循环的if语句中,开始最好先加个延迟;
其次 u8RxData 数组最好足够大,不然如果输入数值多的话可能会超出;
最后,加个清除 u8RxData 数组内容的函数void Clear_u8RxData(void)放在while循环末尾会更好。
以上为我的拙见,欢迎批评;

单片小菜 发表于 2023-1-9 11:09

现在是收到的数据不对

wubangmi 发表于 2023-1-9 11:21

我觉得你用uartmode1会有惊喜

单片小菜 发表于 2023-1-9 18:08

wubangmi 发表于 2023-1-9 11:21
我觉得你用uartmode1会有惊喜

我试试看,看看有啥惊喜。

豌豆爹 发表于 2023-1-10 11:03

用了uartmode1楼主惊喜吗

单片小菜 发表于 2023-1-11 17:41

豌豆爹 发表于 2023-1-10 11:03
用了uartmode1楼主惊喜吗

必须的

朝生 发表于 2023-1-13 16:58

hulai123456 发表于 2023-1-5 11:14
上述代码中
while循环的if语句中,开始最好先加个延迟;
其次 u8RxData 数组最好足够大,不然如果输入数值 ...

跟延时没有关系吧,正常来说收到立马发出去是没有问题的。

软核硬核 发表于 2023-1-13 16:58

https://bbs.21ic.com/icview-3276552-1-1.html

芯路例程 发表于 2023-1-13 16:59

这种简单的例程官方应该是有提供的吧。

tpgf 发表于 2023-2-2 13:25

看着像是数据格式发送方和接收方不一样啊

nawu 发表于 2023-2-2 13:32

如果每次接受到的数据都不同 那么建议楼主在发送数据的时候加一个延时

aoyi 发表于 2023-2-2 13:39

可以看看确认波特率是不是9600这个用示波器就能搞定

单片小菜 发表于 2023-2-2 14:49

已经搞定,可以结贴了

zljiu 发表于 2023-2-2 15:06

wubangmi 发表于 2023-1-9 11:21
我觉得你用uartmode1会有惊喜

我还是没有看明白 从哪里能看出来楼主用的是 什么模式呢

gwsan 发表于 2023-2-2 15:33

单片小菜 发表于 2023-1-9 11:09
现在是收到的数据不对

用示波器看看发送的数据是不是对的啊 因为你不能肯定发送的就是对的

tfqi 发表于 2023-2-2 15:46

gwsan 发表于 2023-2-2 15:33
用示波器看看发送的数据是不是对的啊 因为你不能肯定发送的就是对的

楼上说的很有道理需要有确定的证据表明发送方没有问题

十年江湖心 发表于 2023-3-31 09:28

单片小菜 发表于 2023-2-2 14:49
已经搞定,可以结贴了

想知道楼主是怎么搞定的,我刚接触华大的,确实看不明白,感谢楼主

kkzz 发表于 2023-4-7 09:58

这个可能时钟配置的不准确的            
页: [1] 2
查看完整版本: HC32F005串口的问题??