STM32 F407ZGT6 用串口UART2读取US100超声波问题

2019-07-20 06:37发布



以下是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  之类的。。。
想过用定时器做另外一种测距,但是还是想弄 明白为啥这里用串口读取的数据这么奇怪。。。。求解。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
正点原子
1楼-- · 2019-07-20 08:37
 精彩回答 2  元偷偷看……
njzyxiong
2楼-- · 2019-07-20 14:14
修改为:
1.    d1=USART2_ReadData();
2.    while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==RESET);
3.    d2=USART2_ReadData();

执行第一条语句后,USART_SR 中的RXNE位清零,当串口接收第二个字节时,该位置一,然后再读取数据
否则 ,你两次读取的数据是一样的,也就是说你测出来的数据是257mm的整数倍

1051695085
3楼-- · 2019-07-20 19:26
 精彩回答 2  元偷偷看……

一周热门 更多>