串口DMA

2019-10-16 06:01发布

串口DMA发送数据错误
寄存器0的值=0X0001;
寄存器1的值=0X000F;
寄存器2的值=0X00FF;

串口DMA接收到的数据为  01 03 00 00 00 03 05 CB   //读1号站0开始的连续3个寄存器的值,05 CB为CRC校验码,低字节在前,高字节在后;
串口DMA应发送的数据为  01  03 06 00 01 00 0F FF FF 2D 06

可现在串口返回的数据为  01  03 06 00 01 00 0F FF FF FF   或者  01  03 06 00 01 00 0F FF FF FD

只要不是读连续的3个寄存,无论是读连续的1个、2个、4个、5个等返回来的值都是正确的

我把要发送的数据一个一个赋到要发送的数组里,然后发送还是不对

不知道问题出在那里了


        send_num= 11;  //要发送的数据长度
        send_buffer[0]=0X01;  //站号
        send_buffer[1]=0X03;  //功能码
        send_buffer[2]=0X06;  //要发送寄存器值的字节数
        send_buffer[3]=0X00;  //寄存器0的值高位在前
        send_buffer[4]=0X01;  //寄存器0的值低位在后
        send_buffer[5]=0X00;  //寄存器1的值高位在前
        send_buffer[6]=0X0F;  //寄存器1的值低位在后
        send_buffer[7]=0XFF;  //寄存器2的值高位在前
        send_buffer[8]=0XFF;  //寄存器2的值低位在后
        send_buffer[9]=0X2D;  //CRC低字节在前
        send_buffer[10]=0X06;  //CRC高字节在后
       就这样一个个的把值赋进去,再发送还是不对


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
lavion
1楼-- · 2019-10-16 11:45
DMA发送 设置为 单次发送.   
发送前夕  数组填好数据.  然后

           DMA_ClearFlag(DMA1_FLAG_TC4);
        DMA_Cmd(DMA1_Channel4,DISABLE);
       DMA1_Channel4->CMAR =(uint32)&Str_View.OverviewFIFO[0];//给DMA 发送的基地址
    DMA_SetCurrDataCounter(DMA1_Channel4,Str_View.FIFOCNT);//设置发送的个数
                DMA_Cmd(DMA1_Channel4,ENABLE);        //启动发送
怎么可能会有错
2672751679
2楼-- · 2019-10-16 17:38
 精彩回答 2  元偷偷看……
lavion
3楼-- · 2019-10-16 20:22
void Uart_OverView_Init(uint8* DataBase,uint32 Len)
{
        /*ê1Äü¶Ë¿úoííaéèê±Öó */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);
  
//        GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

        GPIO_StructInit(&GPIO_InitStructure);
/* ÅäÖýóêÕòy½Å*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* ÅäÖ÷¢Ëíòy½Å */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
       
  //ÅäÖÃ′®¿ú2Îêy
  USART_StructInit(&USART_InitStructure);
        USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode =  USART_Mode_Tx | USART_Mode_Rx;
  /* Configure USARTy */
  USART_Init(USART1, &USART_InitStructure);
   
        /* Enable the USARTy Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
        NVIC_Init(&NVIC_InitStructure);

  USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//′ò¿a½óêÕÖD¶Ï
  

        // ′ò¿aDMAê±Öó
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        //éèÖÃDMA
        /* USARTy TX DMA1 Channel (triggered by USARTy Tx event) Config */
  DMA_DeInit(DMA1_Channel4);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = ((unsigned int)&USART1->DR);
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DataBase;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 1;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);
       
       
        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

  USART_Cmd(USART1, ENABLE);

  DMA_Cmd(DMA1_Channel4, ENABLE);
}

初始化代码,  你自己对吧.    我应用过 无数次

一周热门 更多>