以下是USART初始化:
void UART_Init(void ){
// GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); // 使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); // 使能USART2时钟
// 串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); // GPIOA2复用为USART2
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); // GPIOA3复用为USART2
// USART2端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; // GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽复用输出
GPIO_Init(GPIOA,&GPIO_InitStructure); // 初始化PA2,PA3
// USART2 初始化设置
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件数据流控制
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式
USART_InitStructure.USART_BaudRate = 9600; // 波特率设置
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; // 无奇偶校验位
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收发模式
USART_Init(USART2, &USART_InitStructure); // 初始化串口2
USART_Cmd(USART2, ENABLE); // 使能串口2
}
void USART2_SendData(u8 data ) // 串口2发送
{
USART_SendData(USART2, data); // 发送数据
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);// 等待发送结束
USART_ClearFlag(USART2,USART_FLAG_TXE);
}
u8 USART2_ReadData(void ) // 串口2接收
{
u8 data;
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE) != RESET) // 等待接收
{
data =USART_ReceiveData(USART2);//(USART1->DR); // 读取接收到的数据
}
USART_ClearFlag(USART2,USART_FLAG_RXNE);
return data;
}
-------------------------------------------------------------------------------------------------------------------------------
分割线
-------------------------------------------------------------------------------------------------------------------------------
以下是US100函数:
u16 US100_GetVal(void ) // 返回单位 毫米 mm
{
u8 d1=0,d2=0;
u16 data=0;
USART2_SendData(0x55);
d1=USART2_ReadData();
d2=USART2_ReadData();
data= ( (u16)d1 << 8 ) | d2;
return data;
}
-------------------------------------------------------------------------------------------------------------------------------
分割线
-------------------------------------------------------------------------------------------------------------------------------
int main(void )
{
delay_init(168);
uart_init(115200);
UART_Init();
u16 Dis;
float Disx;
while(1)
{
Dis = US100_GetVal();
if( Dis > 4500 || Dis < 2 ) return;
Disx = (float)Dis / 1000.0f; // 换算单位为 m
printf(" Dist:%.3f
",Disx);
delay_ms(100);
}
}
接收数据没有问题,但是接收回来的数据很神奇,全都是25.7cm的倍数,比如 257 514 771 之类的。。。
想过用定时器做另外一种测距,但是还是想弄 明白为啥这里用串口读取的数据这么奇怪。。。。求解。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1. d1=USART2_ReadData();
2. while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==RESET);
3. d2=USART2_ReadData();
执行第一条语句后,USART_SR 中的RXNE位清零,当串口接收第二个字节时,该位置一,然后再读取数据
否则 ,你两次读取的数据是一样的,也就是说你测出来的数据是257mm的整数倍
一周热门 更多>