OpenEdv-开源电子网

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

搞了几天了 这个问题还不能解决 各路大神帮看看!

[复制链接]

12

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-7-24
在线时间
37 小时
发表于 2014-4-18 11:12:05 | 显示全部楼层 |阅读模式
void MainSystem(void)
{ static u8 mainstauts=0;
  static u8 first=0;
   u8 act=0;

    switch(mainstauts)
     { case CheckCommand:
          
          if(DecodeCommand(&My_CommandFormat)==0)break;
         if(My_CommandFormat.Window==0x07||My_CommandFormat.Window==0x55)break;//开机指令
         act=My_CommandFormat.Window*10+My_CommandFormat.Control;
         if(act==KeyEnter)break;
        //界面编号*10+控件号
        mainstauts=act;///1 2 3 4 5
         break;
  case CutiingSet://长度设定  刚进入要清一下屏
             if(!first)
              {ChangeWindow(2); //切到调试面命令
               DisplayText(3);//显示一次数据
               first=1;
           }
          if(DecodeCommand(&My_CommandFormat)==0)break;
          act=My_CommandFormat.Window*10+My_CommandFormat.Control;
          if(act!=KeyEnter) //正常接收字符
            {CuttingSet(&OperationRun,&Run_systemflay,My_CommandFormat.Data,1);}
          else//按下确定
          {CuttingSet(&OperationRun,&Run_systemflay,My_CommandFormat.Data,2);
         mainstauts=CheckCommand;
       first=0;
     }
   
          break;
  case  SetCutNum: //刚进入要清一下屏
          if(!first)
   {DisplayText(4);//显示一次数据 这里有问题
ChangeWindow(2); //切到调试面命令
first=1;
}
          if((DecodeCommand(&My_CommandFormat))==0)break;
  act=My_CommandFormat.Window*10+My_CommandFormat.Control;
      if(act!=KeyEnter) //正常接收字符
   {SetCutingNum(&OperationRun,My_CommandFormat.Data,1);}
               else//按下确定
                {SetCutingNum(&OperationRun,My_CommandFormat.Data,2);
mainstauts=CheckCommand;
first=0;
}
  act=0;  
  break;
       case  RunCutiing://完成一轮要退出
          if(Operation(&Run_SesorStatus,&OperationRun)==1)mainstauts=CheckCommand;//运行切割切割操作
  if(DecodeCommand(&My_CommandFormat)==0)break;
  act=My_CommandFormat.Window*10+My_CommandFormat.Control;
  mainstauts=act;///1 2 3 4 跳到 停机 设定 与调式界面
  act=0;
               break;
       case StopCutiing : //停机
          //StopRunCuting();
  StopMorotPwm();
               WarningDispalay(WaitStatus);
  CopyImpulseData(&ImpulseNowNum,&OperationRun.NowOperation);//保存当前的数据,perationImpulseLength
  mainstauts=CheckCommand;///1 2 3 4 跳到 停机 设定 与调式界面
  act=0;
               break;
       case TestRun ://调式
          if(!first)
           {ShakedownTest(&Run_systemflay,&OperationRun,0);
first=1; 
}   


      if((DecodeCommand(&My_CommandFormat))==0)break;
  act=My_CommandFormat.Window*10+My_CommandFormat.Control;
 
    if(ShakedownTest(&Run_systemflay,&OperationRun,act))
     {ChangeWindow(0); //切到调试面命令
        
      first=0;
 
      mainstauts=CheckCommand;
                   }
 
  break;
      default:mainstauts=CheckCommand;
         break;
}

}


我串口发送一下命令 在  TestRun  与 CheckCommand 切换!快一下 然后它就是在这两个自动换!ACT也的值也对 但是我就没有发命令  在testRun里要发送几十个的数据要发  
然后就这两个换  我想是不是串口接收有问题

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

使用道具 举报

12

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-7-24
在线时间
37 小时
 楼主| 发表于 2014-4-18 11:14:09 | 显示全部楼层
ISR(USART_RXC_vect)
{ u8  temp=0;
  

 // CLI_RX;
  if((MY_UartRxdBuff.UartDataHead==MY_UartRxdBuff.UartDataTail)&&(MY_UartRxdBuff.UartDataCounter==UartRxdBuffSize))
     { temp=UDR;
   SEI_RX; 
   return ;//缓冲区数据满返回1退出 
 }
  MY_UartRxdBuff.UartRxdBuf[MY_UartRxdBuff.UartDataHead++]=UDR;
  MY_UartRxdBuff.UartDataCounter++;
  if(MY_UartRxdBuff.UartDataHead>=UartRxdBuffSize)
    {MY_UartRxdBuff.UartDataHead=0;
    } 
 SEI_RX; 
// sei();
}
/****************************************************
函数功能:发送列队中的数据
传入参数:列队中的数据 
型号:atmega16
时钟: 16m
返回值说明:返回1 数据为空 写入不成功 为0 成功
说明:    9600
作者:   
*****************************************************/

ISR(USART_UDRE_vect)
{
 
  if((MY_UartTxdBuff.UartDataHead==MY_UartTxdBuff.UartDataTail)&&(MY_UartTxdBuff.UartDataCounter==0))
   { CLI_TX;
     return;}//缓冲区数据空,可能性很少
 //if((MY_UartTxdBuff.UartDataHead!=MY_UartTxdBuff.UartDataTail)&&(MY_UartTxdBuff.UartDataCounter>0))
 // {
    UDR=MY_UartTxdBuff.UartTxdBuf[MY_UartTxdBuff.UartDataTail++];
    MY_UartTxdBuff.UartDataCounter--;
    if(MY_UartTxdBuff.UartDataTail>=UartTxdBuffSize)
      {
   MY_UartTxdBuff.UartDataTail=0;
   } 
//  }//////
// else CLI_TX;///////////  都可以用
     
 // sei();
 SEI_TX;
 //SEI_RX;
}


u8 ReadDataToBuff(u8 *Data,u8 Datalengt)

  if(Data==0)return 1;
  if((MY_UartRxdBuff.UartDataHead==MY_UartRxdBuff.UartDataTail)&&(MY_UartRxdBuff.UartDataCounter==0))
     {return 1;//缓冲区数据以读完返回1退出
 }
  if(Datalengt>MY_UartRxdBuff.UartDataCounter)
    {return 1;}//要接收的数据不够
  if(Datalengt>MY_UartRxdBuff.UartDataCounter)return 1;//读取数据超过了缓冲区的里有数据
  while(Datalengt--)
   {  *Data++=MY_UartRxdBuff.UartRxdBuf[MY_UartRxdBuff.UartDataTail++];
       if(MY_UartRxdBuff.UartDataCounter==0)return 1;
     else MY_UartRxdBuff.UartDataCounter--;
    ///////}
       if(MY_UartRxdBuff.UartDataTail>=UartRxdBuffSize)
        {
 MY_UartRxdBuff.UartDataTail=0;
         } 
}
  return 0;
}


u8 DecodeCommand(CommandFormat *Command)

  u8 tempdata;
  static u8 tempnowcommand[4];//命令
 // u8 i;


  if(ReadDataToBuff(&tempdata,1)!=0) return 0;
  if(AnalyseCode(tempdata,tempnowcommand)!=2) return 0;
  Command->Window=tempnowcommand[0];
  Command->Control=tempnowcommand[1];
  Command->Type=tempnowcommand[2];
  Command->Data=tempnowcommand[3];
 // for(i=0;i<4;i++)tempnowcommand=0;
  if((Command->Data>=0x30)&&(Command->Data<=0x39))Command->Data-=0x30;
  return 1; 
}
帮帮看看吧!
回复 支持 反对

使用道具 举报

12

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-7-24
在线时间
37 小时
 楼主| 发表于 2014-4-18 11:21:14 | 显示全部楼层
单独测串口一点问题都没有!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-18 20:29:01 | 显示全部楼层
有仿真器吧?
仿真下吧,你这问题用仿真器很好分析。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-7-24
在线时间
37 小时
 楼主| 发表于 2014-4-19 08:42:49 | 显示全部楼层
没有!以后要加一个仿真了!原子哥!不过我问题找到了,解决了,就是原因不明!
我延时一下就好了!不过在菜单的选择 ,延时一下也没事!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-10 05:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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