【问题标题】:nested switch case not working [closed]嵌套开关盒不起作用[关闭]
【发布时间】:2012-10-03 10:52:15
【问题描述】:

我正在尝试使用 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;
               }
            }
          }

为嵌套的 switch case 创建一个函数并在主 switch case 中调用,如下所示。

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

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

提前致谢。

我已经解决了这个问题。

【问题讨论】:

  • 你的缩进离真棒还差得很远,看代码有点困难。
  • 更改后的case(muxsel): 的情况是否还能编译?我看不到c 来自switch(c) 的任何地方。更不用说case 2: ----,但我认为它是一个占位符。
  • 命令是全局变量吗? 此代码由专家编写
  • 也许它不是由代码编写者选择的全局变量。这看起来像一个完整的代码。没有#include 也没有声明它......好吧,它看起来确实很奇怪。或者我错过了什么。 status 也是如此。当你在变量名中输入错字时,这个默认的 int 类型编译器经常会发出警告吗?
  • 我以某种方式编辑了代码以更正缩进。非常困难,因为 OP 将一些块置于部分状态,而没有右括号..

标签: c embedded avr


【解决方案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: 

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

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) {  

【讨论】:

  • 是的,感谢您的回复,我已经按照您的说法声明并尝试了,但仍然没有执行内部开关。我的问题是我正在执行我声明的所有命令,但我想在主开关案例命令“muxsel”之一中选择更多案例。为此,我如前所述编写了 switch case。如果我在超级终端上选择“muxsel”命令,那么它会像“muxselection”一样打印,然后如果我在第二个开关中输入 1 以选择“case '1'”,则不会打印任何内容。它正在打印“找不到命令”。
  • @verendra - 好的,首先,看看编辑。我没有看到你使用任何换行符,所以现在每次你得到一个字符 c 之后添加额外的 getchar() 调用。如果 still 失败,那么我们需要更多代码。请完整添加您的新代码,以便我们停止猜测。
  • 现在我已经清楚地添加了我的完整代码和问题。请你看看并建议我。
  • @verendra - 你仍然会遇到我在编辑中提到的问题。第一次运行getchar() 时,您将获得输入的内容,下一次您将获得'\n' 字符。正如我提到的,您需要使用换行符。尝试打印c,这样你就能明白我的意思了。在你每次得到它之后添加这一行:printf("%c %d\n", c, c); 第二次你得到c 你会看到它是“10”,它是一个换行符。不是你想要的。
  • 是的,即使我已经尝试过,它仍然显示“找不到命令”。可能是这些情况,也可能不在命令列表中。是这个原因吗?我不这么认为......
【解决方案2】:

我写它作为答案,因为在 cmets 中没有它的位置。虽然它绝对不是最终令人满意的一次,但它可能会帮助你到达那里。

现在我看到了两个问题。你说你试图改变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 代码,不存在于那里。

【讨论】:

  • 谢谢你的回复,我想你明白我的问题了。如果我尝试使用第二种方法,它会执行无限次但没有进入 selcase();对于 muxselection,没有声明意味着你说“”缺失。
  • 我不明白的是,为什么在第二种情况下你要手动读取 c。而在前者你不?我无法正确理解您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
相关资源
最近更新 更多