本帖最后由 yjnisangel 于 2013-7-16 22:30 编辑
stm32 串口2 采用DMA方式数据接收发送,用串口调试助手,=在19200波特率下,100ms周期下,连续发送80个字节的一帧数据,回上来时数据有错误,麻烦高手帮我看下是哪里的问题,我是采用空闲中断接收数据的,串口中断如下
void USART2_IRQHandler(void)
{
uint16 i;
if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET)
{
// USART_ClearITPendingBit(USART2, USART_IT_IDLE);
//读SR后读DR清除Idle
i = USART2->SR;
i = USART2->DR;
DMA_Cmd(DMA1_Channel6, DISABLE);
DataLen=256-DMA_GetCurrDataCounter(DMA1_Channel6);
//if(DataLen=0)
if(DataLen > 0)
{
//if(!USART_GetITStatus(USART2,USART_IT_IDLE))
//将数据送DMA存储地址
for(i=0;i<DataLen;i++)
{
USART2_SEND_DATA=USART2_RECEIVE_DATA;
}
RxEnd=1;//接收结束标志
}
DMA1_Channel6->CMAR = (u32)USART2_RECEIVE_DATA;
DMA1_Channel6->CNDTR = 256;//重装填
DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA
}
RxInterruptFlag=1;//接收中断标志位
TimerRxCount=0;//串口中断时不定时计数
DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//清标志
if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错
{
USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE);
}
// USART_ClearITPendingBit(USART2, USART_IT_TC);
}
在main函数里,串口发送回来收到得数据
while (1)
{
if(RxEnd==1)
{
RxEnd=0;
//USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
DMA_Cmd(DMA1_Channel7, DISABLE); //改变datasize前先要禁止通道工作
DMA1_Channel7->CNDTR=DataLen; //DMA1,传输数据量
DMA1_Channel7->CMAR = (u32)USART2_SEND_DATA;
//USART2_TxFlag=0;//DMA传输开始标志量
DMA_Cmd(DMA1_Channel7, ENABLE);
}
收发缓存都是定义256,串口调试助手上,连续发送定长数据,收到的数据有时会一串数据后面丢了几个字节,有时会两帧数据链在一起发回来
麻烦高手指点下,先谢谢了
|