2012-10-03 4 views
-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; 
} 
} 

내 문제는 내가 모든 명령을 실행하고있다하지만 난 메인 스위치의 경우 명령 "어떠한 위험한 전압 변동들로부터 아날로그"중 하나에 좀 더 케이스를 선택합니다. 그것을 위해 중첩 된 스위치 케이스를 썼다. hyperteminal에서 "muxsel"명령을 선택하면 "muxselection"과 같이 인쇄됩니다. 그런 다음 두 번째 스위치에서 "case '1'을 선택하기 위해 1을 입력하면 아무 것도 인쇄되지 않습니다. 그것은 "command not found"를 인쇄 중입니다. 무엇이 문제인가. 중첩 된 스위치를 실행하고 싶지만 위의 코드를 사용하여이 작업을 수행 할 수 없습니다.

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"과 같은 메인 스위치의 명령에서 하나를 선택하고 싶습니다. 그 후에는 mux 채널을 case 문을 사용하여 선택해야합니다. 어떤 도움을 주셔서 감사합니다.

미리 감사드립니다.

이 문제를 해결했습니다.

+5

들여 쓰기가 아주 멀리 떨어져있어서 코드를 읽기가 약간 어렵습니다. – unwind

+1

'case (muxsel) :'가 변경된 경우가 컴파일됩니까? 나는'c '가'switch (c)'를 위해 올 곳이 없다고 봅니다. '케이스 2 : ---- '은 말할 것도없고, 장소 홀더라고 생각합니다. – luk32

+4

명령이 전역 변수입니까? *이 코드는 전문가가 작성했습니다 * – wildplasser

답변

1

확인 ... 코드가 뚜렷한 것은 아니지만, 으로 보입니다. 문제가 발생했습니다. 이 같은 코드를 수정하려고 : 당신이 cuniCom() 함수의 범위에서 선언하지 않아도

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이 표시됩니다. 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가 정의 된 방법, 내가 틀릴 수도 ...하지만 난 '때문에 너의 문제가 내기에 갈거야. 그런데 "bad input"과 같은 메시지가있는 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) { 
+0

그래, 답장을 보내 주셔서 감사합니다, 당신이 말했지만 시도했지만 여전히 내부 스위치를 실행하지 선언했습니다. 내 문제는 내가 선언 한대로 모든 명령을 실행하지만 주 스위치 케이스 명령 "muxsel"중 하나에서 더 많은 경우를 선택하고 싶습니다. 왜냐하면 내가 앞에서 설명한 스위치 케이스를 썼다. hyperteminal에서 "muxsel"명령을 선택하면 "muxselection"과 같이 인쇄됩니다. 그런 다음 두 번째 스위치에서 "case '1'을 선택하기 위해 1을 입력하면 아무 것도 인쇄되지 않습니다. 그것은 "command not found"를 인쇄 중입니다. – verendra

+0

@verendra - 좋습니다. 먼저 수정 사항을 확인하십시오. 나는 당신이 개행 문자를 사용하는 것을 보지 못하기 때문에 지금 당장 문자'c'를 얻을 때마다 여분의'getchar()'호출을 추가한다. 여전히 * 실패 *하면 더 많은 코드가 필요합니다. 추측을 중지 할 수 있도록 전체 코드를 추가하십시오. – Mike

+0

이제 코드와 문제를 완전히 추가했습니다. 제발 저를보고 제안 해주세요. – verendra

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

두 번째 경우가 아마도 컴파일 될 수 있습니다. 내가 이해할 수없는 것은, 왜 2 번째 경우에 수동으로 c을 읽어야하는지입니다. 이전에는 그렇지 않습니까? 그것은 uniCom 루틴 내에로드해야합니까? 확실히 getCom()에 있습니다. 어쩌면 당신은 uniCom 또는 그 이하 수준의 버퍼를 망쳐서는 안됩니다. while(rxcounter0)도 이제까지 멈출 것입니까? 그리고 getchar() 사람이 키보드로 타이핑하는 인간 사용자의 표준 입력으로부터 문자를 읽는 것을 의미한다면, 거기에 존재하지 않는 꽤 낮은 ASCII 코드이므로 1 또는 2를 읽는 것이 어려울 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 제 문제를 이해하고 계신 것 같습니다. 두 번째 접근 방식으로 시도하는 경우 그것은 무한 시간을 excuiting 있지만 selcase() 입력하지; muxselection에 당신이 누락되었다고 선언하는 수단이 없습니다. – verendra

+0

내가 이해하지 못하는 것은, 왜 2 번째 경우에 수동으로 c. 이전에는 그렇지 않습니까? 나는 당신의 질문을 제대로 이해할 수 없습니다. – verendra

관련 문제