OpenEdv-开源电子网

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

STM32 和电脑串口通讯 如果通讯前,单片机按复位,返回给电脑的速度就快,如果不按,返回给电脑的就很慢,但数值仍是对的,问?

[复制链接]

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2016-1-28
在线时间
135 小时
发表于 2016-3-11 13:20:11 | 显示全部楼层 |阅读模式
1金钱
STM32 和电脑串口通讯 如果通讯前,单片机按复位,返回给电脑的速度就快,如果不按,返回给电脑的就很慢,但数值仍是对的,问?
/*******************************************************************************
* 函数名称:USART1_Command()
* 函数功能:执行上位机任务
* 入口参数:无
* 出口参数:无
* 返 回 值:无
*******************************************************************************/
void USART1_Command(void)
{
  uint16_t i,j;
  uint8_t CmdMode=0xFF;
  float Temp;

  if((RxBuffer1[RxCounter1-2] !='P')||(RxBuffer1[RxCounter1-1] !='P')) return;

  switch(RxCounter1){
               
        case 6:        /* 判断是否测试命令 *//*V1.2*/
    for(i=0;i<12;i++)   /*i:命令的条数*/
          {       
      for(j=0;j<6;j++)  /*j:命令长度*/
                        {
        if(RxBuffer1[j] != TAB_UART1CMD[i][j]) break;
      }
      if(j>=6)
                        {
        CmdMode=i;
        break;
      }
    }
    break;
               
        case 16:        /* 判断是否参数设置命令 */
    if((RxBuffer1[0] =='A')&&(RxBuffer1[1] =='A'))
                {
      CmdMode=12;        // V1.1
          }
                else
                {
            return;
          }
    break;
  default:
    return;
  }

  switch(CmdMode){
  case 0:        /*采集电流*/
    GetADData_3012(0,0);break;
  case 1:        /*采集目标Mic灵敏度*/
    GetADData_3012(1,0);break;

     /* sprintf(TxBuffer1,"70HZ%03dSS1KHZ%03dSS5KHZ%03dSSLEAK %03d %03dSS",360,360,360,0,0);                                
      TxCounter1=41;
      TxIndex1=0;
      USART_SendData(USART1, TxBuffer1[TxIndex1]);break;*/

  case 2:        /*采集标准Mic灵敏度*/
    GetADData_3012(1,1);break;
  case 3:       
  case 4:
  case 5:
  case 6:/* 继电器控制*/
        KJ_Init(CmdMode-2,0x01&(~(KJ_ReadState(CmdMode-2))));
                                                                        /////////////////////////
    TxBuffer1[0]=0x30+CmdMode-2;        //////599-610应答信号
    TxBuffer1[1]=TxBuffer1[0];
    if(0==KJ_ReadState(CmdMode-2)){
      TxBuffer1[2]='L';
      TxBuffer1[3]='L';
    }else{
      TxBuffer1[2]='H';
      TxBuffer1[3]='H';
        }
       
        /*
    TxCounter1=4;
    TxIndex1=0;
    USART_SendData(USART1, TxBuffer1[TxIndex1]);*/
        TxBuffer1[4]='\0';
        printf("%s",TxBuffer1);
                                                                //////////////////////////////
    break;
        /* 20160104 */
        case 7:/*单独70测试*/
        GetADData_Fre(0,0);break;
        case 8:/*单独1K测试*/
        GetADData_Fre(0,1);break;
        case 9:/*单独5K测试*/
        GetADData_Fre(0,2);break;
        case 10:/*单独1B测试*/
        GetADData_Fre(0,3);break;
        /*V1.2*/
        case 11:
       
         //Delay_ms(20);
         __set_FAULTMASK(1);      // 关闭所有中端
     NVIC_SystemReset();// 复位
         break;


  case 12:        /* 参数设置 */
    for(i=2;i<14;i++){
      if((RxBuffer1[i] <'0')||(RxBuffer1[i] >'9')) return;
        }

    /* 电压参数 */
    Temp=RxBuffer1[2]-0x30;
    Temp*=10;
    Temp+=(RxBuffer1[3]-0x30);
    System_InitData.VOLTAGE=Temp/10;

    /* 电阻参数 */
    Temp=RxBuffer1[6]-0x30;
    Temp*=10;
    Temp+=(RxBuffer1[7]-0x30);
    Temp*=10;
    Temp+=(RxBuffer1[8]-0x30);
    Temp*=10;
    Temp+=(RxBuffer1[9]-0x30);
    Temp/=1000;

        for(i=0;i<8;i++){
          if(Temp==TAB_RESISTOR[i]) break;
        }
    if(i<8){
          System_InitData.RESINDEX=i;
        }else{
          System_InitData.RESINDEX=0;
        }

    /* 延时参数 */
    i=RxBuffer1[10]-0x30;
    i*=10;
    i+=(RxBuffer1[11]-0x30);
    i*=10;
    i+=(RxBuffer1[12]-0x30);
    i*=10;
    i+=(RxBuffer1[13]-0x30);
    System_InitData.DELAYTIME[0]=i;

        System_StateFresh(); /****系统动作参数刷新****/

    TxBuffer1[0]='O';
    TxBuffer1[1]='K';
    /*TxCounter1=2;
    TxIndex1=0;
    USART_SendData(USART1, TxBuffer1[TxIndex1]);*/
        TxBuffer1[2]='\0';
        printf("%s",TxBuffer1);
        /*
    Delay_ms(20);
        __set_FAULTMASK(1);      // 关闭所有中端
    NVIC_SystemReset();// 复位
    */
    break;
  }
}

/*******************************************************************************
* 函数名称:USART_Configuration()
* 函数功能:USART 配置
* 入口参数:无
* 出口参数:无
* 返 回 值:无
*******************************************************************************/
void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;

  USART_InitStructure.USART_BaudRate = 9600;                                                                                        /* 波特率:9600 */
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;                                                /* 数据位:8 */
  USART_InitStructure.USART_StopBits = USART_StopBits_1;                                                          /* 停止位: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;                                /* 二线模式 */

  /* Configure the USART1,3 */
  USART_Init(USART1, &USART_InitStructure);
  USART_Init(USART3, &USART_InitStructure);

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);        /* 允许接收中断 */
  //USART_ITConfig(USART1, USART_IT_TC, ENABLE);                /* 允许发送完成中断 */
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);        /* 允许接收中断 */
  //USART_ITConfig(USART3, USART_IT_TC, ENABLE);                /* 允许发送完成中断 V1.5 */
       
       
  USART_ITConfig(USART1, USART_IT_PE, ENABLE);    //开启PE错误接收中断Bit 8PEIE: PE interrupt enable
  //CR2 开启ERR中断
  USART_ITConfig(USART1, USART_IT_ERR, ENABLE);       
  /* Enable USART1,3 */
  USART_Cmd(USART1, ENABLE);
  USART_Cmd(USART3, ENABLE);

  USART_ClearFlag(USART1,USART_FLAG_TC);
  USART_ClearFlag(USART3,USART_FLAG_TC);
}


/*******************************************************************************
* 函数名称:USART1_IRQHandler()       
* 函数功能:USART1中断处理,清除中断标志,接收数据或发送数据
* 入口参数:无
* 出口参数:无
* 返 回 值:无
*******************************************************************************/
void USART1_IRQHandler(void)
{
  uint8_t  Temp;
  int      Count;

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    Temp = USART_ReceiveData(USART1);        //接收1字节数据

    if(0==USART1_RxFlag){
      RxBuffer1[RxCounter1] = Temp;                // 保存到接收缓冲区
      RxCounter1++;

      switch(RxBuffer1[0]){
                case 'A':
                Count=16;
                break;
                case 'S':
                Count=6;
                break;
                default:
                RxCounter1=0;
                Count=32;
                break;
      }

      if(RxCounter1==Count) USART1_RxFlag=1;
    }

        TimeCount_USART1=Time_mS_Value;

    USART_ClearITPendingBit(USART1, USART_IT_RXNE);        // 清除接收中断标志
  }

  if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
  {
    USART_ClearITPendingBit(USART1, USART_IT_TC);                //清除发送中断标志

    TxCounter1--;
    if(TxCounter1>0){
      TxIndex1++;
      USART_SendData(USART1, TxBuffer1[TxIndex1]);                // 发送1字节数据
    }
  }
}





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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-3-11 13:49:53 | 显示全部楼层

复位以后,开始送数据快,然后越来越慢,

是这意思吗?


回复

使用道具 举报

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2016-1-28
在线时间
135 小时
 楼主| 发表于 2016-3-11 15:47:26 | 显示全部楼层
不是,就是奇怪,发送响应 case 12后,再发送响应case 1的代码就会很慢((很慢显示在电脑端));如果一开始直接就发送case 1的代码就会响应很快(很快就能显示在电脑端)。。但是实际操作必须先响应 case 12,才能操作响应case 1,所以很郁闷。
case1:要响应的事件:
void GetADData(uint8_t Mode,uint8_t Port)
{
  double      AD1_CH0_Value=0,
              AD1_CH1_Value=0,
              tk=0,
              AD1_CH2_Value,
              AD1_CH2_70Hz_Min=0,
              AD1_CH2_70Hz_Max=0,
              AD1_CH2_1KHz_Min=0,
              AD1_CH2_1KHz_Max=0;

  int32_t     CH2_Value_Temp=0;

  double      AD1_CH2_Temp[10];
  double      TempSwap;

  //int CurrentValue,DB70,DB1K,DB5K,DBDiff70,DBDiff1K;
  int         i,j,k;
  

  switch(Mode){
  case 0:
                Delay_ms(20);        /* 增加延时 */

                for(i=0;i<100;i++){
                AD_Value=ADC3_ConvertedValue[0];
                AD1_CH0_Value+=AD_Value;
                AD_Value=ADC3_ConvertedValue[1];
                AD1_CH1_Value+=AD_Value;
                Delay_us(5);
                }

                AD1_CH0_Value=AD1_CH0_Value/100.0/4096.0*VREF*3.5;
                AD1_CH1_Value=AD1_CH1_Value/100.0/4096.0*VREF*3.5;
                Current_Value=AD1_CH0_Value-AD1_CH1_Value;
                Current_Value=Current_Value/1.0-AD1_CH1_Value/7.78;       
                if(Current_Value<0) Current_Value=0;
                CurrentValue=Current_Value*1000;
       
                printf("II%04dSS",CurrentValue);

  break;
  case 1:  
                for(i=2;i>=0;i--)
                {
               
                        SET_ON_SELECT_Reset();                      /*SET_ON端复位*/
                        SELECT_CLMIC(Port);                       
                        RESINDEX_COV_GPIO(System_InitData.RESINDEX);

                        Delay_ms(2);
                                               
                        SET_ON_SELECT_SWITCH('A',i);                /*准备状态*/
                        SELECT_CLMIC(Port);                        
                        RESINDEX_COV_GPIO(System_InitData.RESINDEX);

                        Delay_ms(2);

                        SET_ON_SELECT_SWITCH('B',i);                /*执行状态*/
                        SELECT_CLMIC(Port);                        
                        RESINDEX_COV_GPIO(System_InitData.RESINDEX);
                       

                        /* 采样 */
                        /* 采样速率设置 */
                        TIM2_Config(TAB_TIM_TIME[i].T1,TAB_TIM_TIME[i].T2);

                        Delay_ms(System_InitData.DELAYTIME[i]);

                        /* 采样并计算有效值 */
                        if (i>0)
                        {
                                for(j=0;j<10;j++)
                                {
                                        AD1_CH2_Value=0;
                                        for(k=0;k<50;k++)
                                        {
                                                while(!ADC_Flag);
                                                        ADC_Flag=0;
                                                CH2_Value_Temp=ADC_ConvertedValue[k];
                                                CH2_Value_Temp-=2048;
                                                AD1_CH2_Value+=(CH2_Value_Temp*CH2_Value_Temp);
                                        }

                                        AD1_CH2_Value/=50;
                                        AD1_CH2_Value=sqrt(AD1_CH2_Value);

                                        AD1_CH2_Temp[j]=AD1_CH2_Value;
                                }

                                for(j=0;j<10;j++)
                                {
                                        for(k=j;k<10;k++)
                                        {
                                          if(AD1_CH2_Temp[j]>AD1_CH2_Temp[k])
                                          {
                                                        TempSwap=AD1_CH2_Temp[j];
                                                        AD1_CH2_Temp[j]=AD1_CH2_Temp[k];
                                                        AD1_CH2_Temp[k]=TempSwap;
                                          }
                                        }
                                }
                                  
                                if(1==i)
                                {
                                        AD1_CH2_1KHz_Min=AD1_CH2_Temp[0],
                                        AD1_CH2_1KHz_Max=AD1_CH2_Temp[9];
                                }
                                tk=0;
                                for(j=2;j<10-2;j++)  
                                {       
                                        tk+=AD1_CH2_Temp[j];
                                }
                                AD1_CH2_Value=tk/6;         


                                /* 计算测量结果 */
                                if(AD1_CH2_Value)
                                {
                                        AD1_CH2_Value=AD1_CH2_Value/4096*3000/10607;
                                        AD1_CH2_Value=log10(AD1_CH2_Value)*20;

                                        if(fabs(AD1_CH2_Value-MicDBValue[i])>=MicDBValueAdj[i])
                                        {
                                                MicDBValue[i]=AD1_CH2_Value;
                                        }
                                        if(fabs(AD1_CH2_Value-MicDBValue[i])<MicDBValueAdj[i])
                                        {
                                                MicDBValue[i]=AD1_CH2_Value;         ////////////3+MicDBValue[i]/3*2;
                                        }
                                        AD1_CH2_Value=fabs(MicDBValue[i]);
                                }
                                /*if (i==1)
                                {
                                   DB1K=fabs(MicDBValue[1])*10;
                                   printf("1KHZ%03dSS",DB1K);
                                }
                                if (i==2)
                                {
                                   DB5K=fabs(MicDBValue[2])*10;
                                   printf("5KHZ%03dSS",DB5K);
                                }*/

                    }
                        if (i==0)
                        {
                                        for(j=0;j<3;j++)
                                        {
                                                        AD1_CH2_Value=0;
                                                        for(k=0;k<50;k++)
                                                        {
                                                                while(!ADC_Flag);
                                                                        ADC_Flag=0;
                                                                CH2_Value_Temp=ADC_ConvertedValue[k];
                                                                CH2_Value_Temp-=2048;
                                                                AD1_CH2_Value+=(CH2_Value_Temp*CH2_Value_Temp);
                                                        }

                                                        AD1_CH2_Value/=50;
                                                        AD1_CH2_Value=sqrt(AD1_CH2_Value);

                                                        AD1_CH2_Temp[j]=AD1_CH2_Value;
                                        }


                                        //for(j=0;j<10;j++)
                                        for(j=0;j<3;j++)
                                        {
                                        for(k=j;k<3;k++)
                                        {
                                          if(AD1_CH2_Temp[j]>AD1_CH2_Temp[k])
                                          {
                                                        TempSwap=AD1_CH2_Temp[j];
                                                        AD1_CH2_Temp[j]=AD1_CH2_Temp[k];
                                                        AD1_CH2_Temp[k]=TempSwap;
                                          }
                                        }
                                        }
                                        if(0==i)
                                        {
                                                AD1_CH2_70Hz_Min=AD1_CH2_Temp[0],
                                                //AD1_CH2_70Hz_Max=AD1_CH2_Temp[9];
                                                AD1_CH2_70Hz_Max=AD1_CH2_Temp[2];
                                        }

                                  
                                        tk=0;
                                        for(j=0;j<3;j++)   /* 开始和结束值根据需要修改 */
                                        {       
                                                tk+=AD1_CH2_Temp[j];
                                        }
                                        //AD1_CH2_Value=tk/6;          /* 总的数量值根据实际修改 */
                                        AD1_CH2_Value=tk/3;          /* 总的数量值根据实际修改 */


                                        /* 计算测量结果 */
                                        if(AD1_CH2_Value)
                                        {
                                                AD1_CH2_Value=AD1_CH2_Value/4096*3000/10607;
                                                AD1_CH2_Value=log10(AD1_CH2_Value)*20;

                                                if(fabs(AD1_CH2_Value-MicDBValue[i])>=MicDBValueAdj[i])
                                                {
                                                        MicDBValue[i]=AD1_CH2_Value;
                                                }
                                                if(fabs(AD1_CH2_Value-MicDBValue[i])<MicDBValueAdj[i])
                                                {
                                                        MicDBValue[i]=AD1_CH2_Value;         ////////////3+MicDBValue[i]/3*2;
                                                }
                                                AD1_CH2_Value=fabs(MicDBValue[i]);
                                        }
                                        //DB70=fabs(MicDBValue[0])*10;
                                        //printf("70HZ%03dSS",DB70);
                    }
                }//for 循环结束
                /*复位初始状态*/
                SET_ON_SELECT_Reset();                      /* SET_ON端复位 */
                SELECT_CLMIC(Port);                         /* 选择被测咪头 */
                RESINDEX_COV_GPIO(System_InitData.RESINDEX);/* 输出电阻选择 */
               
       
                if(AD1_CH2_70Hz_Min)
                {
                        AD1_CH2_70Hz_Min=AD1_CH2_70Hz_Min/4096*3000/10607;
                        AD1_CH2_70Hz_Min=log10(AD1_CH2_70Hz_Min)*20;
                }
                if(AD1_CH2_70Hz_Max)
                {
                        AD1_CH2_70Hz_Max=AD1_CH2_70Hz_Max/4096*3000/10607;
                        AD1_CH2_70Hz_Max=log10(AD1_CH2_70Hz_Max)*20;
                }
                MicDBValue[3]=AD1_CH2_70Hz_Max-AD1_CH2_70Hz_Min;
        
                /*
                if(AD1_CH2_1KHz_Min)
                {
                        AD1_CH2_1KHz_Min=AD1_CH2_1KHz_Min/4096*3000/10607;
                        AD1_CH2_1KHz_Min=log10(AD1_CH2_1KHz_Min)*20;
                }
                if(AD1_CH2_1KHz_Max)
                {
                        AD1_CH2_1KHz_Max=AD1_CH2_1KHz_Max/4096*3000/10607;
                        AD1_CH2_1KHz_Max=log10(AD1_CH2_1KHz_Max)*20;
                }
                MicDBValue[4]=AD1_CH2_1KHz_Max-AD1_CH2_1KHz_Min;
        */
       
                DB70=fabs(MicDBValue[0])*10;
                DB1K=fabs(MicDBValue[1])*10;
                DB5K=fabs(MicDBValue[2])*10;
                DBDiff70=fabs(MicDBValue[3])*10;
                DBDiff1K=fabs(MicDBValue[4])*10;

                switch(Port)
           {
                        case 0:/* UART1输出被测DB数据 */
                                /*
                                sprintf(TxBuffer1,"70HZ%03dSS1KHZ%03dSS5KHZ%03dSSLEAK %03d %03dSS",DB70,DB1K,DB5K,DBDiff70,DBDiff1K);                               
                                TxCounter1=41;
                                TxIndex1=0;
                                USART_SendData(USART1, TxBuffer1[TxIndex1]);*/
                                //printf("70HZ%03dSS1KHZ%03dSS5KHZ%03dSSLEAK %03d %03dSS",DB70,DB1K,DB5K,DBDiff70,DBDiff1K);
                            printf("ZCOK");
                        break;
                        case 1:
                                /*
                                sprintf(TxBuffer1,"70BM%03dSS1KBM%03dSS5KBM%03dSS",DB70,DB1K,DB5K);                               
                                TxCounter1=27;
                                TxIndex1=0;
                                USART_SendData(USART1, TxBuffer1[TxIndex1]);*/
                                //printf("70BM%03dSS1KBM%03dSS5KBM%03dSS",DB70,DB1K,DB5K);
                            printf("BZOK");
                        break;
                }
        break;
  }
}
回复

使用道具 举报

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2016-1-28
在线时间
135 小时
 楼主| 发表于 2016-10-31 09:47:16 | 显示全部楼层
已解决~
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
发表于 2016-10-31 09:56:42 | 显示全部楼层

怎么回事导致的?
回复

使用道具 举报

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2016-1-28
在线时间
135 小时
 楼主| 发表于 2016-10-31 14:58:19 | 显示全部楼层
dreamARM 发表于 2016-10-31 09:56
怎么回事导致的?

说来话长,就是外部晶振没工作,单片机自动切换到内部晶振。也能通讯,就是慢。乍一看,根本找不出原因。
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
发表于 2016-11-1 08:43:46 | 显示全部楼层
qjp1988113 发表于 2016-10-31 14:58
说来话长,就是外部晶振没工作,单片机自动切换到内部晶振。也能通讯,就是慢。乍一看,根本找不出原因。

哦。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 21:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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