现在使用STM32芯片,主要处理方式如下:2路AD采集采用DMA方式,1个键盘和1组LED显示都采用实时扫描,定时器2中断方式作为时间基准,1个串口全双工通讯接收采用中断方式。其中串口和键盘为接受指令端,PC发的数据为指令包长度小于15;指令采集实时性要求高的操作。接收到指令后处理采集在进行显示,显示分为控制板硬件显示和PC端显示部分。定时器基准为5us,串口速度115200;串口接收和发送数据为数据包格式。 现在问题:1.串口接收到数据进行判断并进行相关赋值指令处理。调试发现串口经常接受指令无法完成,有丢失数据包的情况。请教怎么解决这个问题。猜想为处理时间不足操作,如果只接收主机进行处理,那么一直接收到的指令怎么样及时回复主机。如果用DMA,主程序处理指令也需要等候指令。串口中断处理函数如下: if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET) { if(BufUsartINStatue==0) //等待主机相应上一个指令后接受新指令。 { mid_usartdata=(u8)USART_ReceiveData(USARTx); if (BufUsartInNum==0) //输入指令包格式判断,输入位为0时在是否为起始符; { if (mid_usartdata==0xbb) //数据包头判断 { BufUsartInData[BufUsartInNum]=mid_usartdata; BufUsartInNum++; } } else if(BufUsartInNum<5) { BufUsartInData[BufUsartInNum]=mid_usartdata; BufUsartInNum++; } else if(BufUsartInNum>14) //超出数据包限定长度结束。 { BufUsartINStatue=3; BufUsartInNum=0; } else { if(BufUsartInNum==(BufUsartInData[1]+3)) //判断数据包长度完成; { BufUsartInData[BufUsartInNum]=mid_usartdata; if (BufUsartInData[BufUsartInNum]==0xee) BufUsartINStatue="1"; //判断最后一个字符是否为结束符 else BufUsartINStatue="2"; BufUsartInNum=0; } else { BufUsartInData[BufUsartInNum]=mid_usartdata; BufUsartInNum++; } } } }
|