-2

我正在尝试使用 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”,然后我使用案例语句选择多路复用通道。任何帮助表示赞赏。

提前致谢。

我已经解决了这个问题。

4

2 回答 2

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:
              ...

这导致了下一个问题。您要的是 charc但您的案例是建立在int. 例如,如果用户输入 3,你得到的是字符 '3' 或 int 51。检查ASCII 表

因此,您的案例现在适用于标题开头 (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) {  
于 2012-10-03T11:45:38.377 回答
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 码不存在于那里。

于 2012-10-03T11:57:22.703 回答