我是用的STM32F103,485串口中断接收控制指令,然后解析,再通过485DMA返回数据,现在出现的问题是:485DMA返回的数据在字符串的首位和末位都会加0x00,比如应该返回:0x01,0x41,0xC0,0x10。结果返回的数据为:0x00,0x01,0x41,0xC0,0x10,0x00。不知道哪地方出问题了,如果用232DMA返回的话就不会出现这个问题,贴出代码,请原子哥和各位大神看看咋解决。
串口配置:
[mw_shl_code=c,true] USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; //打开串口的收发功能
/* 配置USART2,用于接收云控命令 */
USART_Init(USART3, &USART_InitStructure);
/* 打开串口2接收中断 */
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
/* 使能USART2的DMA的发送请求 */
USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE);
/* 使能串口2 */
USART_Cmd(USART3, ENABLE);[/mw_shl_code]
DMA配置:
[mw_shl_code=c,true] DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(USART3->DR));
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)UART2.SendBuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 0x00;
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_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/* 配置DMA1_2 */
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
DMA_ClearFlag(DMA1_IT_TC2);
/* 使能DMA1_2发送完成中断 */
/* 使能DMA1_2,用于发送摄像机命令 */
DMA_Cmd(DMA1_Channel2, ENABLE);
DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);[/mw_shl_code]
串口接收中断:
[mw_shl_code=c,true]void USART3_IRQHandler(void)
{
if(SET == USART_GetITStatus(USART3, USART_IT_RXNE))
{
Command_Receive();
}
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
}[/mw_shl_code]
DMA发送:
[mw_shl_code=c,true] GPIO_SetBits(GPIOA, GPIO_Pin_8);
delay_us(100);
DMA_Cmd(DMA1_Channel2, DISABLE);
DMA1_Channel2->CMAR = (uint32_t)UART2.SendBuf;
DMA1_Channel2->CNDTR=UART2.SendDataLen;
DMA_Cmd(DMA1_Channel2, ENABLE);[/mw_shl_code]
串口发送完成中断:
[mw_shl_code=c,true]void DMA1_Channel2_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC2) != RESET )
{
DMA_ClearFlag(DMA1_FLAG_TC2);
USART_ITConfig(USART3,USART_IT_TC,ENABLE);
}
DMA_ClearITPendingBit(DMA1_IT_TE2);
DMA_Cmd(DMA1_Channel2, DISABLE);
while(RESET == USART_GetITStatus(USART3, USART_IT_TC))
{
}
delay_us(100);
USART_ClearITPendingBit(USART3,USART_IT_TC);
USART_ITConfig(USART3,USART_IT_TC,DISABLE);
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
}[/mw_shl_code]
|