-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の宣言が表示されません。おそらく、 ""がありませんか?次に、2番目のアプローチ。

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;
}
}

私の問題は、宣言したとおりにすべてのコマンドを実行しているのですが、メインのswitchcaseコマンド「muxsel」の1つでさらにいくつかのcaseを選択したいです。そのために私はネストされたswitchcaseを書きました。ハイパーターミナルで「muxsel」コマンドを選択すると、「muxselection」のように印刷されます。次に、1を入力して2番目のスイッチで「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;
               }
            }
          }

以下に示すように、ネストされたスイッチケース用に1つの関数を作成し、メインスイッチケースで呼び出します。

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

この方法も機能しません。この問題を解決する方法を教えてください。「muxsel」などのメインスイッチcaseのコマンドの1つを選択したいのですが、その後、caseステートメントを使用してmuxチャネルを選択します。助けていただければ幸いです。

前もって感謝します。

私はこの問題を解決しました。

4

2 に答える 2

1

OK ...コードはそれほど明確ではありませんが、私はあなたの問題を見ていると思います。次のようにコードを変更しようとしました。

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

これは次の問題につながります。あなたはcharを求めてcいますが、あなたのケースはに基づいていますint。たとえば、ユーザーが3を入力した場合、取得するのは文字「3」またはint51です。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

コメントにその場所がないので、私は答えとしてそれを書きました。一度は絶対に満足のいくものではありませんが、そこにたどり着くのに役立つかもしれません。

今のところ、2つの問題があります。あなたはあなたが変更しようとしたと言います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、多分行方不明""ですか?次に、2番目のアプローチ。

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;
  }
}

2番目のケースはおそらくコンパイルできます。私が理解していないのは、なぜ2番目のケースで手動で読むのかということですc。前者にいる間、あなたはしませんか?ルーチン内にロードする必要がuniComありますか?それは確かにですgetCom()uniComたぶん、レベル以下のバッファをいじってはいけません。また、それwhile(rxcounter0)が止まると確信していますか?またgetchar()、キーボードで入力する人間のユーザーからの標準入力から文字を読み取る手段の場合、これらは非常に低いASCIIコードであるため、1または2を読み取るのは難しい場合があります。

于 2012-10-03T11:57:22.703 に答える