OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5031|回复: 6

F4串口2发指令给超声波模块,模块返回距离数据给单片机再通过串口1发到PC显示可是读出来的数据是我自己发送的指令且超声波未工作

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-3-12
在线时间
4 小时
发表于 2017-5-15 22:15:20 | 显示全部楼层 |阅读模式
12金钱
我这里买了一个12路超声波模块。该模块采用RS232串口通信,其通讯接口的通讯协议为:通讯参数为波特率9600,无奇偶校验,8个数据位,1个停止位。通过单片机向超声波模块发送控制指令(操作码和数据),操作码为0xb1-0xbc,用于选择测量距离和读数据方式,如0xb1表示最远距离(建议大于2米)索要测量长度数据,不间断返回距离数据,盲区290mm,最远显示距离:3500mm。数据为2位16进制,先高字节,后低字节组成的16位来确定索要哪几个探头数据和机号,其中低12位(0-11)确定索要数据的探头号,高4位(12-15)确定机号,低12位中第n位为1,则n+1号探头需要输出距离数据。例如:0x10 0x35则表示机号为01的模块返回1、3、5、6号探头的数据。
而该超声波模块返回单片机的数据包括通讯字头0xff,操作码0xa1-0xac对应上述表示测量长度的0xb1-0xbc,数据为每个返回探头数据包含3个字节,2位十进制BCD码(先高字节,后低字节,长度单位为mm)+探头号,先从低位探头号开始返回数据。
如单片机向超声波模块发送b1 10 35,则超声波模块返回数据为ff a1 05 20 01 ff a1 08 15 03 ff a1 20 05 05 ff a1 25 35 06代表1号探头距离为520mm,3号为815mm,5号为2005mm,6号为2535mm。
我的程序是主函数给超声波模块发送b1 10 35指令,然后在中断读数据,每读到6个数据就发送到串口1 在PC上显示。
问题是显示的数据是我自己发送的指令,如b1 10 35 b1 10 35这6个数据。
请问大家可以帮我看看什么问题吗,难道不应该我发送指令,这边就返回距离数据吗,怎么我发的指令被读回来了。
谢谢大家了,下面是代码

int fputc(int ch, FILE *f)

{        
        while((USART1->SR&0X40)==0);

        USART1->DR = (u8) ch;      

        return ch;
}

#endif
#if EN_USART2_RX   
       
u8 USART_RX_BUF[USART_REC_LEN];   

u16 USART_RX_STA=0;     

void uart2_init(u32 bound){
  
        GPIO_InitTypeDef GPIO_InitStructure;

        USART_InitTypeDef USART_InitStructure;

        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ,ENABLE);
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);

        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIOA,&GPIO_InitStructure);

  
        USART_InitStructure.USART_BaudRate = bound;

        USART_InitStructure.USART_WordLength = USART_WordLength_8b;

        USART_InitStructure.USART_StopBits = USART_StopBits_1;

        USART_InitStructure.USART_Parity = USART_Parity_No;

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;       

        USART_Init(USART2, &USART_InitStructure);
       
        USART_Cmd(USART2, ENABLE);  
       
       
#if EN_USART2_RX       

        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

       
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;               

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                       


        NVIC_Init(&NVIC_InitStructure);       

#endif
       
}

void uart1_init(u32 bound){
   
        GPIO_InitTypeDef GPIO_InitStructure;

        USART_InitTypeDef USART_InitStructure;

       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);

        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIOA,&GPIO_InitStructure);

   
        USART_InitStructure.USART_BaudRate = bound;

        USART_InitStructure.USART_WordLength = USART_WordLength_8b;

        USART_InitStructure.USART_StopBits = USART_StopBits_1;

        USART_InitStructure.USART_Parity = USART_Parity_No;

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


        USART_Init(USART1, &USART_InitStructure);
         
        USART_Cmd(USART1, ENABLE);   

       
}



void USART2_IRQHandler(void)  
                     
{

        u8 Res;

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)

        {

                 USART_ClearITPendingBit(USART2,USART_IT_RXNE);       

                Res =USART_ReceiveData(USART2);       
               
                USART_RX_BUF[USART_RX_STA&0x1fff]=Res;

                USART_RX_STA++;

                if(USART_RX_STA>100)

                USART_RX_STA|=0x8000;                       
  }
下面是主函数
int main(void)
{

        u8 t;
        u8 len;       
        u16 times=0;  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);               
        uart1_init(115200);
        uart2_init(9600);       
        LED_Init();                                 

       
        while(1)
        {

                                                USART_ClearFlag(USART2,USART_FLAG_RXNE);
            USART_ClearFlag(USART2,USART_FLAG_TC);
                                        USART_SendData(USART2,0xb2);        
                                while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
       
                                        USART_SendData(USART2,0x1f);      
                                while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
       
                                        USART_SendData(USART2,0xff);      
                                while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);

        if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x1fff;
                        for(t=0;t<len;t++)
                        {
                                USART_SendData(USART1,USART_RX_BUF[t]);        
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }
                        USART_RX_STA=0;
                }else
                {
                        times++;
                        if(times%30==0)LED0=!LED0;
                        delay_ms(10);   
                }
        }
}


麻烦各位大神帮我看一下谢谢啦十万火急


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-16 21:36:06 | 显示全部楼层
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-3-12
在线时间
4 小时
 楼主| 发表于 2017-5-16 22:41:39 | 显示全部楼层

原子哥可以为小弟解惑不,万分感谢啦
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-17 21:34:30 | 显示全部楼层
linzheng 发表于 2017-5-16 22:41
原子哥可以为小弟解惑不,万分感谢啦

先检查你的串口2发送数据是否正常。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-7-11
在线时间
2 小时
发表于 2017-9-27 20:37:46 | 显示全部楼层
我也是这样,串口助手发送跟接受是正常的,但串口1发指令给超声波模块,模块返回距离数据给存在数组里,仿真显示读出来的数据是我自己发送的指令,完全不知道怎么回事,这是我的代码
[mw_shl_code=applescript,true]#include "stdio.h"
#include "stm32f10x.h”
#include "stm32f10x_usart_config.h"
#include "misc_config.h"

/* Private functions ---------------------------------------------------------*/


/**
  * @brief  中断向量表USART1配置
  * @param  None
  * @retval None
  */
void NVIC_USART1_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


/**
  * @brief  中断向量表USART2配置
  * @param  None
  * @retval None
  */
void NVIC_USART2_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
/**
  * @brief  中断向量表TIM2配置
  * @param  None
  * @retval None
  */
void NVIC_TIM2_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIM2_PREEMPTION_PRIORITY;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIM2_SUB_PRIORITY;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
void NVIC_Configuration(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);      //使能复用功能时钟
//        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); /*使能SWD 禁用JTAG*/       
//        DBGMCU->CR  &= ~((uint32_t)1<<5);   
//        AFIO->MAPR = (AFIO->MAPR & ~((uint32_t)0x7 << 24)) | (2 << 24);     /*  PA15 PB3 PB4 */       
        NVIC_USART1_Config();
        NVIC_USART2_Config();
        NVIC_TIM2_Config();
}
/**
  * @brief  InitUsart1Gpio
  * @param  None
  * @retval None
  */
void InitUsart1Gpio(void)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
}


/**
  * @brief InitUsart1
  * @param  None
  * @retval None
  */
void InitUsart1(void)
{
        USART_InitTypeDef USART_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);
        USART_Cmd(USART1, ENABLE);
}


/**
  * @brief  InitUsart2Gpio
  * @param  None
  * @retval None
  */
void InitUsart2Gpio(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}


/**
  * @brief  InitUsart2
  * @param  None
  * @retval None
  */
void InitUsart2(void)
{
        USART_InitTypeDef USART_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART2, &USART_InitStructure);
        USART_Cmd(USART2, ENABLE);
}






/**
  * @brief  定时器2 IO口配置 TIM2CH1通道IO口(PA0)
  * @param  None
  * @retval None
  */
void InitTimer2Gpio(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/**
  * @brief  定时器2配置,配置为
  * @param  None
  * @retval None
  */
void InitTimer2(void)
{

        /*开启Tim2时钟*///TIM2->PSC = (72-1);TIM2->ARR = (5-1); 72M;定时5us
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,
                               ENABLE); /*APB1和APB2分频给定时器,APB1最大72M,APB2最大36M(即不分频的状态)*/
        /* 预分频器psc:72,得到1000Khz的计数时钟     72000000/72=1000000HZ=0.000001s=0.001ms */
        TIM2->PSC = (72-1);
        /*设定计数器自动重装值arr //1000KHZ---> 一个脉冲周期0.001ms ----> 5000个周期=5ms;即5ms一到就中断且重新计数 */
        TIM2->ARR = (5-1);   
        //TIM7->DIER|=1<<0;     /*允许更新中断*/
        TIM_ClearFlag(TIM6, TIM_FLAG_Update);   //清除更新中断,免得一打开就产生中断
        /* 禁止更新中断 */
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
        /* 使能定时器2 */
        TIM_Cmd(TIM2, ENABLE);
}

u16 overcount;
int test_tim2_time = 0;
void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
{
       
                if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //产生中断
                {  
                                TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除中断标志位

                                //超声波触发引脚:高电平时间20us 周期为65ms
                                test_tim2_time++;
                                if(13001 == test_tim2_time)
                                {
                                        USART_SendData(USART2, 0x55);
                                        test_tim2_time =0;
                                       
                                }
                               
                                overcount++;         
                }  

}

u8 ultrasonic_uart_period = 0;
int usart2_out_to = 0;
u8 Data[51] ={0};
static int usart2_recieveFun(u8 ch)
{

        static int recive_count = 0;
        static u8 i=0;
                        Data[recive_count] = ch;
                        recive_count++;
        if(51 == recive_count)
        {
                for(i=0;i<51;i++)
                {
                        Data = 0;
                        recive_count = 0;
                }
        }
        return 0;
}
/**********************************************************************
* @brief  USART2&#214;D&#182;&#207;oˉêy  
* @param  &#206;T
* @retval &#206;T
***********************************************************************/
void USART2_IRQHandler(void)
{
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {               
                USART_ClearFlag(USART2, USART_FLAG_RXNE);
                USART_ClearITPendingBit(USART2, USART_IT_RXNE);
                usart2_recieveFun(USART_ReceiveData(USART2));  //&#189;óê&#213;′&#174;&#191;ú2êy&#190;Y
        }
        if( USART2->SR &(1<<3) )//&#197;D&#182;&#207;ê&#199;·&#241;ò&#231;3&#246;′í&#206;ó
        {
                USART_ReceiveData(USART2);//&#182;áDR
                USART_ClearFlag(USART2, USART_FLAG_ORE); //&#182;áSR
        }
}

int main(void)
{       
        SystemInit();
        NVIC_Configuration();          
       
        InitUsart1Gpio();
        InitUsart1();
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_ClearFlag(USART1, USART_FLAG_RXNE);
        InitUsart2Gpio();
        InitUsart2();
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        USART_ClearFlag(USART2, USART_FLAG_RXNE);       

        InitTimer2();
       
        while(1)               
        {       
//                printf("measurement: %d \n ",measurement);
                //printf("distance1: %f \n ",distance);
                //USART_SendData(USART2, 0x55);
       
        }
}

[/mw_shl_code]

请原子哥跟大神们帮忙看看,一直不知道是什么原因。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-7-11
在线时间
2 小时
发表于 2017-9-27 20:41:21 | 显示全部楼层
这个是我这个的超声波模块的时序图
未命名图片.png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-28 00:30:07 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 00:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表