打印

[求助] GD32F450dma接收问题

[复制链接]
3805|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2021-8-21 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助用过这个芯片的大佬,串口接收配置为dma方式,当接收到的数据长度与配置长度相等时。输出来始终多着2个字节。请问什么原因

接收配置如下:
/* deinitialize DMA1 channel2 (USART0 rx) */
    dma_deinit(DMA1, DMA_CH2);
    dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;                        //传输模式,外设到存储(接收)
    dma_init_struct.memory0_addr = (uint32_t)rxbuffer;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.number = 100;
    dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0);
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
    dma_single_data_mode_init(DMA1, DMA_CH2, &dma_init_struct);

    /* configure DMA mode */
    dma_circulation_disable(DMA1, DMA_CH2);
    dma_channel_subperipheral_select(DMA1, DMA_CH2, DMA_SUBPERI4);

        usart_interrupt_enable(USART0, USART_INT_IDLE);
        /* USART interrupt configuration */
        nvic_irq_enable(USART0_IRQn, 6, 0);

    /* enable DMA1 channel2 */
    dma_channel_enable(DMA1, DMA_CH2);
        usart_dma_receive_config(USART0, USART_DENR_ENABLE);


//串口0 DMA接收,只触发空闲中断
void USART0_IRQHandler(void){

        u8 revLen;

    if(RESET != usart_flag_get(USART0, USART_FLAG_IDLE))
    {
                USART_STAT0(USART0);
                usart_data_receive(USART0);                                //清除串口中断
               revLen = 100 - dma_transfer_number_get(DMA1, DMA_CH2);
                dma_channel_disable(DMA1, DMA_CH2);
                dma_transfer_number_config(DMA1, DMA_CH2, 100);
                dma_flag_clear(DMA1,DMA_CH2,DMA_INTF_FTFIF);
                dma_channel_enable(DMA1, DMA_CH2);
//                printf("len:%d %s\r\n",revLen,rxbuffer);
                printf("%s",rxbuffer);
                memset(rxbuffer,0,100);
    }
}

printf输出的信息。当接收数据小于100字节时。都是正确的。当接收数据大于等于100字节时。能输出接收到的100字节数据。但是还多了两个字节0xC4 10
请问各位要怎么解决

使用特权

评论回复
沙发
sonicll| | 2021-8-25 09:03 | 只看该作者
估计是和你打印的方式有关,printf("%s",rxbuffer);这句,%s需要检测到0x00才算字符串结束,当你接收100个字节时,rxbuffer填满了,%s需要往rxbuffer之后的空间继续搜索0x00才能结束,所以就会多打印内容。解决的方法,要么不要使用printf打印,要么把rxbuffer的大小设置成101字节,确保最后一个字节始终为0x00

使用特权

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

本版积分规则

2035

主题

7344

帖子

10

粉丝