谢谢楼上顶贴,问题没有解决,目前还是在计数置位后加延时2MS来工作的。
void USART2_IRQHandler(void){
//溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR其实就是清除标志
USART_ReceiveData(USART2); //读DR
}
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
{
Rs485Rx[Rs485Rxcont++]=USART_ReceiveData(USART2);
if(Rs485Rxcont==7){
Usart2_Get_Flag=TRUE;
Delay(2);
}
// Clear the USART2 Receive interrupt
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
}
主程序也非常简单:
while(1)
{
if(Usart2_Get_Flag)
{GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(1));
printf("%1c%1c%1c%1c%1c%1c%1c",0x03,0x03,0x02,0x02,0x04,0xC1,0x27);
GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(0));
Rs485Rxcont=0;
Usart2_Get_Flag=FALSE;
}
}
其它设置见楼主位贴,如果不加延时就不能工作,加了就能工作。非常奇怪。
“半双工的 收发要切换时要加个小延时的”,这点倒是没有问题。 |