OpenEdv-开源电子网

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

帮忙看一下:串口接收几次才能回一次

[复制链接]

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-1-12
在线时间
34 小时
发表于 2019-8-14 21:00:07 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 隋树 于 2019-8-14 21:02 编辑

麻烦帮看一下我下面的程序,调了一天,不清楚什么毛病。

串口接收是以0D0A结尾,接收到数据后,在主循环里判断 if(USART_RX_STA&0x8000),如果这个表达式是1,就把数据返回,可实际操作的时候,接几次才能发送一次。接收是没问题的,板子的继电器都动作了。


while(1)
{
  filter();  
  ADC_Value[0]=ADC_Value[0]*1.05;
  if(TIM_FLAGBIT) 500ms发一次,这段发送是没问题的
  {
   TTLDataSendBuff[0]=(u8)(ADC_Value[0]*10);
   TTLDataSendBuff[1]=(u8)(ADC_Value[1]*10);
   TTLDataSendBuff[2]=(u8)(ADC_Value[2]*10);
   TTLDataSendBuff[3]=(u8)(ADC_Value[3]*10);
   TTLDataSendBuff[4]=(u8)(ADC_Value[4]*10);
   TTLDataSendBuff[5]=(u8)(ADC_Value[5]*10);
   for(senddata=0;senddata<6;senddata++)
   {
    USART_SendData(USART2,TTLDataSendBuff[senddata]);
    while((USART2->SR&0X40)==0);
   }
   TIM_FLAGBIT=0;
  }
  
     
  if(USART_RX_STA&0x8000)
  {
   u16 APILECURRENT_Buf, FREQUENCE_Buf;
   u8 Duty_Buf,Time_Buf,S3RELAY_Buf,Add_Buf,relay01,relay02,relay03,relay04,relay05,relay06;
   len=USART_RX_STA&0x3fff;
   for(senddata=0;senddata<len;senddata++)出问题的在这里,经常进了这个循环但不发送数据。
   {
    USART_SendData(USART2,TTLDataRevBuff[senddata]);
    while((USART2->SR&0X40)==0);
   }

   APILECURRENT_Buf=TTLDataRevBuff[0];
   FREQUENCE_Buf=((u16)(TTLDataRevBuff[1])<<8)|TTLDataRevBuff[2];
   Duty_Buf=TTLDataRevBuff[3];
   Time_Buf=((u16)(TTLDataRevBuff[4])<<8)|TTLDataRevBuff[5];
   S3RELAY_Buf=TTLDataRevBuff[6];
   Add_Buf=TTLDataRevBuff[7];
   relay01=TTLDataRevBuff[8];
   relay02=TTLDataRevBuff[9];
   relay03=TTLDataRevBuff[10];
   relay04=TTLDataRevBuff[11];
   relay05=TTLDataRevBuff[12];
   relay06=TTLDataRevBuff[13];
   
   
   if(relay01!=0)   
    GPIO_SetBits(GPIOB,GPIO_Pin_12);
   else
    GPIO_ResetBits(GPIOB,GPIO_Pin_12);
   
   if(relay02!=0)   
    GPIO_SetBits(GPIOB,GPIO_Pin_13);
   else
    GPIO_ResetBits(GPIOB,GPIO_Pin_13);
   
   if(relay03!=0)   
    GPIO_SetBits(GPIOB,GPIO_Pin_13);
   else
    GPIO_ResetBits(GPIOB,GPIO_Pin_13);
   
   if(relay04!=0)   
    GPIO_SetBits(GPIOB,GPIO_Pin_14);
   else
    GPIO_ResetBits(GPIOB,GPIO_Pin_14);
   if(relay05!=0)   
    GPIO_SetBits(GPIOA,GPIO_Pin_12);
   else
    GPIO_ResetBits(GPIOA,GPIO_Pin_12);
   
   if(relay06!=0)   
    GPIO_SetBits(GPIOA,GPIO_Pin_11);
   else
    GPIO_ResetBits(GPIOA,GPIO_Pin_11);   
   
   if(APILECURRENT_Buf!=0)
   {
    APILECURRENT=APILECURRENT_Buf;
    switch (APILECURRENT)
    {
     case 10:
      GPIO_ResetBits(GPIOB,GPIO_Pin_3);
      GPIO_SetBits(GPIOB,GPIO_Pin_7);
      GPIO_ResetBits(GPIOB,GPIO_Pin_4);
      GPIO_ResetBits(GPIOB,GPIO_Pin_5);
      GPIO_ResetBits(GPIOB,GPIO_Pin_6);
      GPIO_ResetBits(GPIOB,GPIO_Pin_8);
      GPIO_ResetBits(GPIOB,GPIO_Pin_9);
      GPIO_ResetBits(GPIOA,GPIO_Pin_8);  
      GPIO_ResetBits(GPIOA,GPIO_Pin_9);
      if(S3RELAY_Buf!=0)
       GPIO_SetBits(GPIOB,GPIO_Pin_3);
      
     break;
     case 16:
      GPIO_ResetBits(GPIOB,GPIO_Pin_3);
      GPIO_ResetBits(GPIOB,GPIO_Pin_7);
      GPIO_ResetBits(GPIOB,GPIO_Pin_4);
      GPIO_ResetBits(GPIOB,GPIO_Pin_5);
      GPIO_ResetBits(GPIOB,GPIO_Pin_6);
      GPIO_SetBits(GPIOB,GPIO_Pin_8);
      GPIO_ResetBits(GPIOB,GPIO_Pin_9);
      GPIO_ResetBits(GPIOA,GPIO_Pin_8);  
      GPIO_ResetBits(GPIOA,GPIO_Pin_9);  
      if(S3RELAY_Buf!=0)
       GPIO_SetBits(GPIOB,GPIO_Pin_4);  
     
     break;
     case 32:
      GPIO_ResetBits(GPIOB,GPIO_Pin_3);
      GPIO_ResetBits(GPIOB,GPIO_Pin_7);
      GPIO_ResetBits(GPIOB,GPIO_Pin_4);
      GPIO_ResetBits(GPIOB,GPIO_Pin_5);
      GPIO_ResetBits(GPIOB,GPIO_Pin_6);
      GPIO_ResetBits(GPIOB,GPIO_Pin_8);
      GPIO_SetBits(GPIOB,GPIO_Pin_9);
      GPIO_ResetBits(GPIOA,GPIO_Pin_8);  
      GPIO_ResetBits(GPIOA,GPIO_Pin_9);  
      if(S3RELAY_Buf!=0)
       GPIO_SetBits(GPIOB,GPIO_Pin_5);   
     
     break;
     case 63:
      GPIO_ResetBits(GPIOB,GPIO_Pin_3);
      GPIO_ResetBits(GPIOB,GPIO_Pin_7);
      GPIO_ResetBits(GPIOB,GPIO_Pin_4);
      GPIO_ResetBits(GPIOB,GPIO_Pin_5);
      GPIO_ResetBits(GPIOB,GPIO_Pin_6);
      GPIO_ResetBits(GPIOB,GPIO_Pin_8);
      GPIO_ResetBits(GPIOB,GPIO_Pin_9);
      GPIO_SetBits(GPIOA,GPIO_Pin_8);  
      GPIO_ResetBits(GPIOA,GPIO_Pin_9);
      if(S3RELAY_Buf!=0)
       GPIO_SetBits(GPIOB,GPIO_Pin_6);  
   
     break;
     case 100:
      GPIO_ResetBits(GPIOB,GPIO_Pin_3);
      GPIO_ResetBits(GPIOB,GPIO_Pin_7);
      GPIO_ResetBits(GPIOB,GPIO_Pin_4);
      GPIO_ResetBits(GPIOB,GPIO_Pin_5);
      GPIO_ResetBits(GPIOB,GPIO_Pin_6);
      GPIO_ResetBits(GPIOB,GPIO_Pin_8);
      GPIO_ResetBits(GPIOB,GPIO_Pin_9);
      GPIO_ResetBits(GPIOA,GPIO_Pin_8);  
      GPIO_SetBits(GPIOA,GPIO_Pin_9);  
     break;
     deflat:
     break;   
    }   
   }   
   if(FREQUENCE_Buf!=0)
   {
    FREQUENCE=FREQUENCE_Buf;
    arr=arr_cnt(FREQUENCE);
    TIM_SetAutoreload(TIM3,arr);   
   }   
   if(Duty_Buf!=0)
   {
    Duty=Duty_Buf;
    Compare2=campare_cnt(FREQUENCE,Duty);   
    TIM_SetCompare2(TIM3, Compare2);  
   }
   if(Time_Buf!=0)
   {
    Time=Time_Buf;
    TIMER_FLAG=0;
   }
    Add=Add_Buf;  
    USART_RX_STA=0;
   
   
  }
  if(Duty<=97&&Duty>=8&&ADC_Value[0]<=9&&ADC_Value[0]>=1)
  {
   if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)==0)
    delay_ms(Time);
    GPIO_SetBits(GPIOB,GPIO_Pin_0);  
    GPIO_SetBits(GPIOB,GPIO_Pin_1);     
  }
  else
   GPIO_ResetBits(GPIOB,GPIO_Pin_0);  
   GPIO_ResetBits(GPIOB,GPIO_Pin_1);     
  
}
}


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-8-15 01:24:02 | 显示全部楼层
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-1-12
在线时间
34 小时
 楼主| 发表于 2019-8-15 09:05:30 | 显示全部楼层
仿真发现进入发送程序了,但就是没有数发出来。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 23:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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