[技术问答] hc32f460串口发送

[复制链接]
5314|8
 楼主| yangjiaoshai 发表于 2021-9-10 11:00 | 显示全部楼层 |阅读模式
94154613aca0711724.png
发数,不知道哪里出问题了,设置发送11次,只有9个数出来,设置13,才有11个数据发送出来
46652613ac9f2af0bd.png
tianmeijiao 发表于 2021-9-10 11:24 | 显示全部楼层
CH340为什么导致蓝屏啊?

评论

CH340的驱动问题吧  发表于 2021-9-10 13:57
martinhu 发表于 2021-9-10 13:56 | 显示全部楼层
你用的例程吗?是MCU收到什么回复什么?
 楼主| yangjiaoshai 发表于 2021-9-13 14:32 | 显示全部楼层
本帖最后由 yangjiaoshai 于 2021-9-13 14:34 编辑
martinhu 发表于 2021-9-10 13:56
你用的例程吗?是MCU收到什么回复什么?

自己照着论坛和手册改的一个模板出来,
发送函数:
void    usart_send(uint8_t *pbuff, uint16_t  size)
{
    uint16_t i;

    DMA_SetBlockSize(DMA_UNIT1, DMA_CH1_TX, 1);
    DMA_SetTransferCnt(DMA_UNIT1, DMA_CH1_TX, 13);
    DMA_SetSrcAddress(DMA_UNIT1, DMA_CH1_TX, (uint32_t)(uart1_rcv));
    DMA_ChannelCmd(DMA_UNIT1, DMA_CH1_TX, Enable);
                DMA_ClearIrqFlag(DMA_UNIT1, DMA_CH1_TX, TrnCpltIrq);
    USART_FuncCmd(USART_CH1, UsartTx, Enable);
    USART_FuncCmd(USART_CH1, UsartTxEmptyInt, Enable);
}
发送DMA配置:

static void DmaUartTxInit(void)
{
        
    stc_dma_config_t stcDmaInitTX;
    stc_irq_regi_conf_t stcIrqRegiCfgTX;

    /* Enable peripheral clock */
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_DMA1 | PWC_FCG0_PERIPH_DMA2,Enable);

    /* Enable DMA. */
    DMA_Cmd(DMA_UNIT1,Enable);

    /* Initialize DMA. */
    MEM_ZERO_STRUCT(stcDmaInitTX);
    stcDmaInitTX.u16BlockSize = 1u; /* 1 block */
                stcDmaInitTX.u16TransferCnt = 11u;
    stcDmaInitTX.u32SrcAddr = (uint32_t)(uart1_TX); /* Set source address. */
    stcDmaInitTX.u32DesAddr = ((uint32_t)(&USART_CH1->DR));//&USART_CH->DR);     /* Set destination address. */
    stcDmaInitTX.stcDmaChCfg.enSrcInc = AddressIncrease;  /* Set source address mode. */
    stcDmaInitTX.stcDmaChCfg.enDesInc = AddressFix;  /* Set destination address mode. */
    stcDmaInitTX.stcDmaChCfg.enIntEn = Enable;       /* Enable interrupt. */
    stcDmaInitTX.stcDmaChCfg.enTrnWidth = Dma8Bit;   /* Set data width 8bit. */


    DMA_InitChannel(DMA_UNIT1, DMA_CH1_TX, &stcDmaInitTX);


    /* Set DMA trigger source. */
    DMA_SetTriggerSrc(DMA_UNIT1, DMA_CH1_TX, EVT_USART1_TI);

    /* Set DMA block transfer complete IRQ */
    stcIrqRegiCfgTX.enIRQn = Int003_IRQn;//DMA_BTC_TX_INT_IRQn;//DMA_BTC_INT_IRQn;//int numb
    stcIrqRegiCfgTX.pfnCallback = &DmaTXBtcIrqCallback;//callback fun
    stcIrqRegiCfgTX.enIntSrc = INT_DMA1_TC1;//DMA_BTC_TX_INT_NUM;//int sourc
    enIrqRegistration(&stcIrqRegiCfgTX);
    NVIC_SetPriority(stcIrqRegiCfgTX.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfgTX.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfgTX.enIRQn);
}

电脑发数给板子,板子收到数据后,置一个标志,然后去主while里去调用发送函数,发送长度是直接设置的,与接收数据个数没关系。接收数组长度为20,大于发送数据的个数
kiwis66 发表于 2021-9-13 14:42 | 显示全部楼层
就是总差两个?
回车换行?
martinhu 发表于 2021-9-14 13:54 | 显示全部楼层
你这里的发送框里面只有11个字节啊,发送的数组定义是多长???
期望它回复多出两个字节?
54811614038b72be3f.png

评论

跟接收长度没关系,接收数组长度是20,预填了数值的,接收数据就相当于一个触发源,接收完后然后发送,就将接收数组里面的前面13个数据发送出来,始终少2个字节。你们没有碰到类似问题吗,难道是哪里设置有问题  发表于 2021-11-11 10:07
 楼主| yangjiaoshai 发表于 2021-11-11 12:31 | 显示全部楼层
搞定了,原因是在DMA的传输完成中断内就把发送关闭了,此时传送还没完成。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

43

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部