串口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
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);
}

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

一周热门 更多>