如下是一段RS485 采用UART1接收程序;但程序调试中UART1_GetFlagStatus(UART1_FLAG_RXNE)读到的永远都是RESET;请帮忙详解:
/***************************** 端口初始化 ************************************/
void Port_Init(void)
{
GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);
GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_HIGH_FAST);//初始化端口B高速推挽输出高电平
GPIO_Init(GPIOC, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_HIGH_FAST);//初始化端口B高速推挽输出高电平
// GPIO_Init(GPIOD, GPIO_PIN_ALL, GPIO_MODE_IN_PU_IT);//初始化端口D上拉输入有中断功能
GPIO_Init(GPIOF, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_SLOW);
}
/***************************** RS485初始化 ************************************/
void Uart1_RS485_Init(void)
{
RS485_RE_LOW();//RS485接收数据使能
RS485_DE_LOW();//RS485发送数据失能
GPIO_WriteLow(GPIOD,GPIO_PIN_5);//关闭RS485发送端口
//GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_IT);//设置为浮动输入
UART1_DeInit();
/*
波特率9600
半双工,异步,1位起始;8位数据、1位停止、无校验、只接收
地址为0*/
UART1_Init((u32)9600, UART1_WORDLENGTH_8D,
UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_RX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);//使能接收中断
UART1_HalfDuplexCmd(ENABLE);//开启半双工模式
UART1_Cmd(ENABLE);//开启串口
}
/***************************** RS485——MCU数据通讯 ************************************/
void Uart1_RS485_Receivebyte(void)
{ uchar i=0,j=0;
while (UART1_GetFlagStatus(UART1_FLAG_RXNE) == RESET);
if(i==5)
{ i=0;
for(j=0;j<5;j++)
{RX_Disbuff[j]=0x00;}
RX_Disbuff[i]=UART1_ReceiveData8();
TimingDelay=0;
TIM1_Cmd(ENABLE);//使能TIM1定时器
TimingDelay = TIM1_GetCounter();//获取TIM1计数值
if(UART1_GetFlagStatus(UART1_FLAG_RXNE) == RESET && TimingDelay<40000 )//判断4ms内是否有新的数据
{i++;
TIM1_SetCounter(0);}
else
{i=0;
TIM1_SetCounter(0);}
}
} |