嵌套开关盒不工作

时间:2012-10-03 10:52:16

标签: c embedded avr

我正在尝试使用USART通信执行一些命令并使用ATmega32-A读取一些值。看看我的代码。我的问题是我想添加一些案例(嵌套开关案例),但我没有得到我想要的。我希望我能提供解决问题所需的大部分信息。

void uniCom(void) {
switch (Command) {
/* ... */
case (muxsel):
  printf(muxselection);
  switch (c) {
    case 1:
      printf("this is mux chaneel1");
      DDRB = 0b10111111;
      PORTB = 0b00000000;
      printf("adc Value", ReadAdc());
      Command = 0;
      break;
    case 2:
      /*-------------------*/
      break;
  }
  Command = 0;
break;
/* ... */
default:
    Command = 0;
    break;
}

} 问题是未定义的c。我没有看到任何muxselection的声明,也许没有“”?现在是第二种方法。

void selcase(void) {
unsigned char c;
printf("muxselection");
while (rx_counter0) {
 c = getchar();
switch (c) {
  case 1:
    printf("this is mux chaneel1");
    DDRB = 0b10111111;
    PORTB = 0b00000000;
    printf("adc Value", ReadAdc());
    Command = 0;
    break;
  case 2:
    /*-------------------*/
    break;
}
}
}
void uniCom(void) {
switch (Command) {
/* ... */
case (muxsel):
  printf(muxselection);
  selcase();
  Command = 0;
  break;
/* ... */
default:
    Command = 0;
    break;
}
}

我的问题是我正在执行我声明的所有命令,但我想在其中一个主开关案例命令“muxsel”中选择更多案例。因为我写了嵌套开关案例。如果我在超级终端上选择“muxsel”命令然后打印就像“muxselection”那么如果我输入1以在第二个开关中选择“case'1'”,则什么都不打印。它正在打印“未找到命令”。问题是什么。我想执行嵌套开关,但我无法使用上面的代码,我也尝试过这样做。

void selcase(void) {
         unsigned char c;
         printf("muxselection");
         while (rx_counter0) {
         c = getchar();

         switch (c) {
                  case '1':
                    printf("this is mux chaneel1");
                    DDRB = 0b10111111;
                    PORTB = 0b00000000;
                    printf("adc Value", ReadAdc());
                    c= 0;
                    break;
                  case '2':
                  /*-------------------*/
                  break;
                 default;
                  break;
               }
            }
          }

为嵌套开关盒创建一个函数,并在主开关盒中调用,如下所示。

  void uniCom(void) {
      switch (Command) {
                 /* ... */
                   case (muxsel):
                          printf(muxselection);
                          selcase();
                          Command = 0;
                          break;
                     /* ... */
                     default:
                       Command = 0;
                       break;
         }
       }

这种方式也不起作用请建议我如何克服这个问题。我想在主开关情况下选择一个命令,例如“muxsel”,之后我使用case语句选择多路复用通道。任何帮助表示感谢。

提前致谢。

我已经解决了这个问题。

2 个答案:

答案 0 :(得分:1)

好的......代码不是很清楚,但我我看到了你的问题。 您试图像这样修改代码:

case (muxsel):
 printf(muxselection);
  switch (c) {
     case 1:
         printf("this is mux chaneel1");
         DDRB = 0b10111111;
         PORTB = 0b00000000;
         printf("adc Value", ReadAdc());
         Command = 0;
         break;
     case 2: 

首先,您没有在c函数的范围内声明uniCom()。所以这不会编译。因为你没有提供完整的代码我假设你知道并且可能真的做了这样的事情:

void uniCom(void) {

    unsigned char c;
    c = getchar();  

    switch (Command) {
      case (no_com):
          Command = 0;
    ....
      case (muxsel):
          printf("muxselection\n"); //Need quotes here and maybe a \n?
          switch (c) {
             case 1:
              ...

这会导致下一个问题。您要求的是c字符,但您的案例是基于int构建的。例如,如果用户输入3,那么你得到的是字符'3'或int 51.检查ASCII Table

所以你的案例是开始标题(SOH),文本开头(STX)等等...现在不会按照你想要的方式工作。你需要这样做:

          switch (c) {
             case 51:     // This is ASCII '1'
              ...
              break;
             case 52:     // This is ASCII '2'

或者这样做:

          switch (c) {
             case '1':
              ...
              break;
             case '2':

由于你没有给出你的意见,或者c是如何定义的,我可能是错的......但是我打赌这是你的问题。顺便说一下,确保最后有一个default个案例,其中包含“输入错误”等消息,这使得这类事情更容易被捕获。

修改
修改代码如下并共享结果:

void runCom(void){
      unsigned char c;
      c = getchar();
      printf("%c %d\n", c, c);   //<-- add this line here
      switch(Command){ 

void selcase(void) {
    unsigned char c;
    printf("muxselection");
    while (rx_counter0) {
        c = getchar();
        printf("%c %d\n", c, c); //<-- and this line here
        switch (c) {  

答案 1 :(得分:0)

我把它写成答案'因为评论中没有它的地方。虽然它绝对不是一次令人满意的,但它可能会帮助你实现目标。

现在我看到两个问题。你说你试过改变case(muxsel)。在我看来,你的代码甚至无法编译。该函数的代码应类似于:

void uniCom(void) {
  switch (Command) {
    /* ... */
    case (muxsel):
      printf(muxselection);
      switch (c) {
        case 1:
          printf("this is mux chaneel1");
          DDRB = 0b10111111;
          PORTB = 0b00000000;
          printf("adc Value", ReadAdc());
          Command = 0;
          break;
        case 2:
          /*-------------------*/
          break;
      }
      Command = 0;
    break;
    /* ... */
    default:
        Command = 0;
        break;
  }
}

问题未定义c。我没有看到muxselection的任何声明,可能会遗漏""? 现在是第二种方法。

void selcase(void) {
  unsigned char c;
  printf("muxselection");
  while (rx_counter0) {
    c = getchar();
    switch (c) {
      case 1:
        printf("this is mux chaneel1");
        DDRB = 0b10111111;
        PORTB = 0b00000000;
        printf("adc Value", ReadAdc());
        Command = 0;
        break;
      case 2:
        /*-------------------*/
        break;
    }
  }
}
void uniCom(void) {
  switch (Command) {
    /* ... */
    case (muxsel):
      printf(muxselection);
      selcase();
      Command = 0;
      break;
    /* ... */
    default:
        Command = 0;
        break;
  }
}

第二种情况可能会编译。我不明白的是,为什么在第二种情况下你手动阅读c。虽然在前者你没有?是否应该在uniCom例程内加载?肯定是getCom()。也许你不应该使用uniCom或更低级别的缓冲区。你还确定while(rxcounter0)会永远停止吗?如果getchar()表示从键入键盘的人类用户的标准输入读取字符,则可能很难从他那里读取1或2,因为这些是非常低的ASCII码。