我正在用Arduino mega 2560编写测试夹具的应用程序,它是基于菜单的程序,我使用的是开关箱,到目前为止我有6种情况,直到4种情况代码正常工作,一旦我进入第5选项或尝试从第5代码访问用例是从开关出来的。我试过用字符和整数变量作为标签,我在第1和第5处复制了第5大小写代码,在第1次中运行良好,我想强调的是,在第5种情况下,语句没有任何问题,这与我可以使用的情况数有关,基本上,每当我想转到第5种情况时,或者在第4种程序脱离开关之后,任何情况下都没有问题。有人能简单介绍一下吗?为了更好的理解,我正在添加串行终端的片段.感谢你的评论和回答
#include<SPI.h>
//define the SPI and other pins
//SPI: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS). for Arduino Mega 2560
#define DATAOUT 51 //mosi
#define DATAIN 50 //miso
#define SPICLOCK 52 //sck
#define TXDSASS 53 //ss
const int RXDSA1SS = 49; // to make other digital i/o pins as a SS for multiple SPIs
const int RXDSA2SS = 48; // to make other digital i/o pins as a SS for multiple SPIs
const int BPFSS = 47; // to make other digital i/o pins as a SS for multiple SPIs
const int POTSS = 46; // to make other digital i/o pins as a SS for multiple SPIs
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(DATAOUT,OUTPUT); // to declair the pinMode
pinMode(DATAIN,INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(TXDSASS,OUTPUT);
pinMode(RXDSA1SS,OUTPUT);
pinMode(RXDSA2SS,OUTPUT);
pinMode(BPFSS,OUTPUT);
pinMode(POTSS,OUTPUT);
Serial.println("***Test Jig by Arduino Mega 2560 Welcomes you***");
SPI.begin();
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("*************Menu*************");
Serial.println("1.Enter 1 for Tx_DSA");
Serial.println("2.Enter 2 for Rx_DSA_1");
Serial.println("3.Enter 3 for Rx_DSA_2");
Serial.println("4.Enter 4 for TunableBPF");
Serial.println("5.Enter 5 for Digital TrimPOT");
//Serial.println("4.Enter 0 to Exit");
while(Serial.available() == 0) {} //wait till user provide input on serial
if(Serial.available())
{
int UserInput = Serial.parseInt();
Serial.println(UserInput);
switch(UserInput)
{
case 1: //**********Tx_DSA code**************//
int choice1;
Serial.println("Welcome to Tx_DSA");
do{
Serial.println("Enter Tx Attenuation in dB: ");
while(Serial.available() == 0) {}//wait till user provide input on serial
float Attn;
Attn=Serial.parseFloat();
Serial.print("Entered Tx Attenuation is: ");
Serial.println(Attn);
byte AttnToDSA;
AttnToDSA = DataToSendDSA(Attn);
Serial.print("DSA resistor to be set in Decimal: ");
Serial.println(AttnToDSA);
//AttnToDSA = AttnToDSA<<2;
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1));
digitalWrite(TXDSASS,LOW);
SPI.transfer(AttnToDSA);
digitalWrite(TXDSASS,HIGH);
digitalWrite(TXDSASS,LOW);
Serial.println("Enter 1 for setting Tx_DSA Attenuation");
Serial.println("Enter 0 for Exit from Tx_DSA");
while(Serial.available() == 0) {}//wait till user provide input on serial
choice1 = Serial.parseInt();
//Serial.println(choice);
}while(choice1==1);
break;
case 2: //**********Rx_DSA_1 code**************//
int choice2;
Serial.println("Welcome to Rx_DSA_1");
do{
Serial.println("Enter Rx_1 Attenuation in dB: ");
while(Serial.available() == 0) {}//wait till user provide input on serial
float Attn;
Attn=Serial.parseFloat();
Serial.print("Entered Rx_1 Attenuation is: ");
Serial.println(Attn);
byte AttnToDSA;
AttnToDSA = DataToSendDSA(Attn);
Serial.print("DSA resistor to be set in Decimal: ");
Serial.println(AttnToDSA);
//AttnToDSA = AttnToDSA<<2;
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1));
digitalWrite(RXDSA1SS,LOW);
SPI.transfer(AttnToDSA);
digitalWrite(RXDSA1SS,HIGH);
digitalWrite(RXDSA1SS,LOW);
Serial.println("Enter 1 for setting Rx_DSA_1 Attenuation");
Serial.println("Enter 0 for Exit from Rx_DSA_1");
while(Serial.available() == 0) {}//wait till user provide input on serial
choice2 = Serial.parseInt();
//Serial.println(choice);
}while(choice2==1);
break;
case 3: //**********Rx_DSA_2 code**************//
int choice3;
Serial.println("Welcome to Rx_DSA_2");
do{
Serial.println("Enter Rx_2 Attenuation in dB: ");
while(Serial.available() == 0) {}//wait till user provide input on serial
float Attn;
Attn=Serial.parseFloat();
Serial.print("Entered Rx_2 Attenuation is: ");
Serial.println(Attn);
byte AttnToDSA;
AttnToDSA = DataToSendDSA(Attn);
Serial.print("DSA resistor to be set in Decimal: ");
Serial.println(AttnToDSA);
//AttnToDSA = AttnToDSA<<2;
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1));
digitalWrite(RXDSA2SS,LOW);
SPI.transfer(AttnToDSA);
digitalWrite(RXDSA2SS,HIGH);
digitalWrite(RXDSA2SS,LOW);
Serial.println("Enter 1 for setting Rx_DSA_2 Attenuation");
Serial.println("Enter 0 for Exit from Rx_DSA_2");
while(Serial.available() == 0) {}//wait till user provide input on serial
choice3 = Serial.parseInt();
//Serial.println(choice);
}while(choice3==1);
break;
case 4: //**********BPF code**************//
int choice4;
word Freq = 0;
String FreqHex;
Serial.println("Welcome to TunableBPF");
do{
Serial.println("Enter BPF Frequncy: ");
while(Serial.available() == 0) {}//wait till user provide input on serial
Freq = Serial.parseInt();
Serial.print("Tx Frequncy: ");
Serial.println(Freq);
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(BPFSS,LOW);
SPI.transfer16(Freq);
digitalWrite(BPFSS,HIGH);
FreqHex = String(Freq, HEX);
Serial.print("Frequncy to be set to Tunable Band Pass Filter in HexaDecimal: ");
Serial.println(FreqHex);
Serial.println("Enter 1 for setting BPF Frequency");
Serial.println("Enter 0 for Exit from BPF");
while(Serial.available() == 0) {}//wait till user provide input on serial
choice4 = Serial.parseInt();
}while(choice4==1);
break;
case 5: //**********Digital TrimPOT code**************//
int choice5;
int Voltage;
SPI.beginTransaction(SPISettings(5000000, MSBFIRST, SPI_MODE0));
digitalWrite(POTSS,LOW);
SPI.transfer(0x1082); //Set default value i.e. 28V in NV register
SPI.transfer(0x30); //Copy NV Register to Wiper Register (Default Value: 28V)
digitalWrite(POTSS,HIGH);
Serial.println("Welcome to Digital TrimPOT");
do{
Serial.println("Enter Voltage to set on Digital POT: ");
while(Serial.available() == 0) {}//wait till user provide input on serial
Voltage = Serial.parseInt();
Serial.print("Entered Voltage: ");
Serial.println(Voltage);
float R3 = 1.65*((Voltage/1.7)-1);
Serial.println(R3);
float RegValue = ((R3/50000)*256)*1000;
Serial.println(RegValue);
digitalWrite(POTSS,LOW);
SPI.transfer16(RegValue); //Write to Wiper register
digitalWrite(POTSS,HIGH);
Serial.print("Register value to be set in Wiper Register: ");
Serial.println(RegValue);
Serial.println("Enter 1 for setting Digital POT Voltage");
Serial.println("Enter 0 for Exit from Digital TrimPOT");
while(Serial.available() == 0) {}//wait till user provide input on serial
choice5 = Serial.parseInt();
}while(choice5==1);
break;
case 6: Serial.println("In 6th case");
break;
default: Serial.println("Invalid Entry, Please enter valid choice");
}
Serial.println("out of Switch");
}
}
int DataToSendDSA(float Attenuation)
{
int DSAAttn=0;
String AttnHex;
//int Attenuation=Attn;
int Binary[]={32,16,8,4,2,1};
float AttnStep[]={16,8,4,2,1,0.5};
int i;
for(i=0;i<6;i++)
{
if(AttnStep[i]==Attenuation)
{
DSAAttn=DSAAttn|Binary[i];
break;
}
else if(AttnStep[i]<Attenuation)
{
DSAAttn=DSAAttn|Binary[i];
Attenuation=Attenuation-AttnStep[i];
}
}
DSAAttn=DSAAttn<<2;
AttnHex = String(DSAAttn, HEX);
Serial.print("Attenuation to be set to DSA in HexaDecimal: "); //remove this print after development
Serial.println(AttnHex);
return DSAAttn;
}

发布于 2021-12-24 09:24:05
在一个开关语句中,可以有4种以上的情况。事实上,没有限制,除了你不能有重复的事实。
您的问题是在其他地方,在您的代码中,遗憾的是,您还没有发布。
我不确定这是否是您的问题,但我正在收到编译器警告:
sketch_dec24a:153: error: jump to case label [-fpermissive]这是由在每个用例标签内声明变量引起的。我建议把它们砌成几块。
case 3: //**********Rx_DSA_2 code**************//
{ // <---- add this
int choice3;
Serial.println("Welcome to Rx_DSA_2");
... blah blah ...
break;
} // <---- add this对其中包含变量声明的每个case标签执行此操作。或者,将声明移到开关语句之外。
https://stackoverflow.com/questions/70472188
复制相似问题