我串口查询方式读数据,读不出数据,请高手指点!原代码如下:
串口初始化函数
#include "sys.h"
#include "usart.h"
u8 USART_RX_BUF[64]; //接收缓冲,最大64个字节.
u8 USART_RX_STA=0; //接收状态标记
void Read_USART1_DR(void)//读串口数据函数
{
// u8 res;
while(USART1->SR&(1<<5));//接收到数据
{
USART_RX_BUF[USART_RX_STA]=USART1->DR;
USART_RX_STA++;
// USART1->SR&=(0<<5);
if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
void uart_init(u32 pclk2,u32 bound)//串口初始化函数
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
USART1->CR2|=0X4fff;
}
以下是主函数
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
int main(void)
{
u8 t=0;
u8 len=0;
// u16 times=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
USART_RX_STA=0;
Read_USART1_DR();
len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
// printf("\n您发送的消息为:\n");
if(len>=1)
{ for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
}
// printf("\n\n");//插入换行
USART_RX_STA=0;
LED0=0;
LED1=1;
delay_ms(300);
LED0=1;
LED1=0;
delay_ms(300);
PAout(8)=1;
}
}
|