C 嵌套开关盒不工作
我正在尝试使用USART通信执行一些命令,并使用ATmega32-A读取一些值。请看一下我的代码。我的问题是我试图添加一些情况(嵌套开关情况),但我没有得到我想要的。我希望我能提供解决问题所需的所有信息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
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);
第二次收到