Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 嵌套开关盒不工作_C_Embedded_Avr - Fatal编程技术网

C 嵌套开关盒不工作

C 嵌套开关盒不工作,c,embedded,avr,C,Embedded,Avr,我正在尝试使用USART通信执行一些命令,并使用ATmega32-A读取一些值。请看一下我的代码。我的问题是我试图添加一些情况(嵌套开关情况),但我没有得到我想要的。我希望我能提供解决问题所需的所有信息 void uniCom(void) { switch (Command) { /* ... */ case (muxsel): printf(muxselection); switch (c) { case 1: printf("this is mux chaneel

我正在尝试使用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;
}
} 这个问题是未定义的。我没有看到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;
}
}
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;
  }
}
我的问题是我正在执行我声明的所有命令,但是我想在一个主开关case命令“muxsel”中选择更多的情况。为此,我编写了嵌套开关案例。若我在hyperteminal上选择“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;
         }
       }
这种方式也不起作用,请建议我如何克服这个问题。在使用case语句选择mux通道之后,我想在主开关的情况下选择一个命令,例如“muxsel”。谢谢你的帮助

提前谢谢


我已经解决了这个问题。

好的。。。代码不是很清楚,但我认为我看到了你的问题。 您尝试按如下方式修改代码:

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: 
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:
              ...
首先,在
uniCom()
函数的作用域中没有声明
c
。这样就不会编译了。因为您没有给出完整的代码,我想您知道这一点,并且可能真的做了这样的事情:

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: 
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。检查

所以现在你的案例是标题开始(SOH),文本开始(STX)等等。。。这不是你想要的方式。您需要执行以下操作之一:

          switch (c) {
             case 51:     // This is ASCII '1'
              ...
              break;
             case 52:     // This is ASCII '2'
          switch (c) {
             case '1':
              ...
              break;
             case '2':
或者这样做:

          switch (c) {
             case 51:     // This is ASCII '1'
              ...
              break;
             case 52:     // This is ASCII '2'
          switch (c) {
             case '1':
              ...
              break;
             case '2':
因为你没有给出你的输入,或者c是如何定义的,我可能错了。。。但我敢打赌这是你的问题。顺便说一句,确保在末尾有一个
default
case,并带有“bad input”这样的消息,这样可以更容易捕捉到这类内容

编辑:
按如下方式修改代码并共享结果:

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

printf(“%c%d\n”,c,c);//我把它作为一个答案写下来,因为在评论中没有它的位置。虽然它肯定不是最后一次令人满意的结果,但它可能会帮助你达到目的

现在我看到两个问题。您说您试图更改
大小写(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;
}
}
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代码,不存在。

您的缩进非常糟糕,这使得读取代码有点困难。这种情况是否适用于修改后的
案例(muxsel):
甚至编译?我看不到
开关(c)的
c
从何而来
。更不用说案例2:------
但我假设它是一个占位符。命令是一个全局变量?这段代码是由专家编写的,可能不是由代码编写者选择的全局变量。这看起来像是一个完整的代码。没有
#include
,也没有对它的声明……看起来很奇怪。或者我遗漏了什么.status的情况也一样。
status
。当您在变量名中输入错误时,默认的int类型编译器会经常发出警告吗?我以某种方式编辑了代码以更正缩进。。非常困难,因为OP将一些块置于部分状态,没有右括号。。是的,谢谢您的回复,我已经按照您所说的那样声明并尝试了,但仍然没有不执行内部开关。我的问题是,我正在执行我声明的所有命令,但我想在一个主开关案例命令“muxsel”中选择更多的案例。为此,我编写了开关案例,如前所述。如果我在hyperteminal上选择“muxsel”命令,它将像“muxselection”一样打印,然后如果我输入1进行选择在第二个开关中的“case'1'”中,没有任何内容正在打印。它正在打印“command not found”。@verendra-好的,首先,查看编辑。我没有看到您使用任何换行符,因此添加额外的
getchar()
每次你现在得到一个字符
c
后都要打电话。如果仍然失败,那么我们需要更多的代码。请完整地添加你的新代码,这样我们就可以停止猜测。现在我已经清楚地添加了我的完整代码和问题。请你看一下并给我建议。@verendra-你仍然会遇到我在我的报告中提到的问题。@编辑。第一次运行
getchar()
时,您将获得键入的内容,下一次您将获得
'\n'
字符。您需要使用我提到的换行符。请尝试打印
c
,以便了解我的意思。每次获得后,添加这一行:
printf(“%c%d\n”,c,c);
第二次收到