打印
[技术问答]

HC32F030J8串口1通信不正常,请分析下原因

[复制链接]
1113|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
andy93762|  楼主 | 2022-7-3 22:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口0能正常通信,但是我配置串口1用串口0一样的方法,死活通信不正常,发送给电脑上位机的数据动不动就少了几个位。感觉设置的波特率偏差比较大造成的。
我用的是内部时钟,RCH=24MHZ。波特率我配置成9600bps也不行。不知道问题出在哪里?
void App_Uart1Init(void)
{
    uint16_t u16Scnt = 0;
    stc_uart_config_t  stcConfig;
    stc_uart_irq_cb_t stcUartIrqCb;
    stc_uart_multimode_t stcMulti;
    stc_uart_baud_t stcBaud;
  stc_gpio_config_t stcGpioCfg;
    DDL_ZERO_STRUCT(stcConfig);
    DDL_ZERO_STRUCT(stcUartIrqCb);
    DDL_ZERO_STRUCT(stcMulti);
    DDL_ZERO_STRUCT(stcBaud);
    DDL_ZERO_STRUCT(stcGpioCfg);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);//使能GPIO模块时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);//使能uart1模块时钟
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortA,GpioPin2,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortA,GpioPin2,GpioAf1);
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA,GpioPin3,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortA,GpioPin3,GpioAf1);
    stcUartIrqCb.pfnRxIrqCb   = RxIntCallback1;//中断入口地址
    stcUartIrqCb.pfnTxIrqCb   = TxIntCallback1;
    stcUartIrqCb.pfnRxFEIrqCb = ErrIntCallback1;
    stcUartIrqCb.pfnPEIrqCb   = PErrIntCallBack1;
    stcUartIrqCb.pfnCtsIrqCb  = CtsIntCallBack1;
    stcConfig.pstcIrqCb = &stcUartIrqCb;
    stcConfig.bTouchNvic = TRUE;

    if(TRUE == stcConfig.bTouchNvic)
    {
         EnableNvic(UART1_IRQn,IrqLevel2,TRUE);
    }
    stcConfig.enRunMode = UartMode1;//模式1
    stcConfig.enStopBit = Uart1bit;  //1bit停止位
    Uart_Init(UARTCH1, &stcConfig);//串口初始化
    Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//采样分频
    stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
    stcBaud.enRunMode = UartMode1;
    stcBaud.u32Baud = 9600;
    u16Scnt = Uart_CalScnt(UARTCH1,&stcBaud);//波特率计算
    Uart_SetBaud(UARTCH1,u16Scnt);//波特率设置
    Uart_ClrStatus(UARTCH1,UartRC);//清接收请求
    Uart_EnableIrq(UARTCH1,UartRxIrq);//使能串口中断  
    Uart_EnableFunc(UARTCH1,UartRx);//使能收发       
}


下面这个是发送函数,每隔1s发送这个数据给上位机
void Uart1_ACK_modbus(void)
{
          uint8_t sendtab[20];
          uint16_t crcnum;
          uint8_t i;
          sendtab[0]=0XAA;
          sendtab[1]=0xBB;
          sendtab[2]=0xCC;
          sendtab[3]=0xDD;
          sendtab[4]=0xEE;
          sendtab[5]=0XFF;
          sendtab[6]=0;       
          for(i=0;i<7;i++)
          {
                          Uart_SendData(UARTCH1,sendtab[i]);
          }                                       
}

使用特权

评论回复
沙发
weifeng90| | 2022-7-4 07:59 | 只看该作者
没用过,时钟看看是不是没有配置正确。

使用特权

评论回复
板凳
andy93762|  楼主 | 2022-7-4 14:03 | 只看该作者
weifeng90 发表于 2022-7-4 07:59
没用过,时钟看看是不是没有配置正确。

时钟频率是24MHZ的

使用特权

评论回复
地板
jonas222| | 2022-7-9 19:55 | 只看该作者
这个跟IO的配置有很大的关系   

使用特权

评论回复
5
fentianyou| | 2022-7-9 21:25 | 只看该作者
是不是RCC时钟没有使能?  

使用特权

评论回复
6
sheflynn| | 2022-7-10 14:16 | 只看该作者
配置串口1和0都是一样的。  

使用特权

评论回复
7
zerorobert| | 2022-7-10 14:43 | 只看该作者
看看官网的例程吧。   

使用特权

评论回复
8
tpgf| | 2022-8-1 11:22 | 只看该作者
是不是相应的io也需要配置啊

使用特权

评论回复
9
nawu| | 2022-8-1 11:31 | 只看该作者
串口配置应该不差啥 主要看io配置那部分

使用特权

评论回复
10
aoyi| | 2022-8-1 11:38 | 只看该作者
时间间隔正确吗

使用特权

评论回复
11
zljiu| | 2022-8-1 11:46 | 只看该作者
硬件上如何分配的呢

使用特权

评论回复
12
gwsan| | 2022-8-1 11:57 | 只看该作者
关掉串口0试试看

使用特权

评论回复
13
tfqi| | 2022-8-1 12:04 | 只看该作者
估计是干扰问题了

使用特权

评论回复
14
wubangmi| | 2022-8-1 12:27 | 只看该作者
如果是直接在原来uart0的代码上改的,那应该就是你硬件的PA2/PA3上有滤波电容造成这个无法通信

使用特权

评论回复
15
zdy_999| | 2022-8-1 15:43 | 只看该作者
  for(i=0;i<7;i++)
          {
                          Uart_SendData(UARTCH1,sendtab[i]);
                        //在这里加延时阻塞
          }        

使用特权

评论回复
16
海滨消消| | 2022-8-16 10:11 | 只看该作者
多看看官方给出的例程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

290

帖子

3

粉丝