我的Arduino上有这段代码:
这些变量被定义为全局变量,如下所示:
#define arraySize 32
char inChar = '0';
char inVariable[arraySize];
byte index = 0;
byte inDigit;
int inNumber;
函数定义如下:
void checkSeriale(){
while(Serial.available() > 0){
Serial.println(Serial.available());
inChar = Serial.read();
if(inChar != ':' && index < arraySize-1 && inChar != ';'){
inVariable[index] = inChar;
index++;
inVariable[index] = '\0';
}else{
break;
}
}
if(inChar == ':'){
index = 0;
while(Serial.available() >0 && index < 10 && inChar != ';'){
inDigit = Serial.read() - '0';
inNumber = inNumber * 10;
inNumber = inNumber + inDigit;
index++;
}
cambioVariabiliSeriale(inVariable);
}
if(inChar == ';'){
cambioVariabiliSeriale(inVariable);
inNumber=0;
inChar='0';
index=0;
}
}
checkSeriale()
函数在Arduino loop()
中循环,其他一些函数运行其他一些不影响这些变量的代码。
此函数应以两种形式从串口获取命令:
variablename:variablevalue
- 这应该将名为variablename的变量的值更改为新接收的值。 command;
- 这应该只是运行一个外部函数来做其他事情。 该函数读取收到的数据,直到达到:
或;
如果收到:
,它会继续阅读以获取值。然后将该值存储在inNumber
变量中,并将inVariable
传递给第二个函数cambioVariabiliSeriale(String inVariable)
,该函数检查inVariable
字符串等于的变量名称并指定{{1} }到与inNumber
同名的变量。
代码似乎完美无缺。每个接收到的信号(使用正确的语法)都可以很好地处理。
但是如果我尝试删除inVariable
行,代码就会停止工作。 Serial.println(Serial.available());
现在始终包含inNumber
。
我不介意在代码中保留该行,但我认为执行该命令使代码保持运行是很奇怪的。
有人知道为什么那条线会影响收到的值的读数吗?
答案 0 :(得分:0)
我已经尝试使用一些虚拟值运行你的代码(见下文),它似乎运行正常,注释掉的行,即innumber确实包含值。然而,经过它我有点意识到我不理解你的逻辑。这大致是流程:
检查字符是否在Serial.available
如果是这样,请执行以下三项操作之一:
a)如果char不是&#39 ;;&#39;或者&#39;:&#39;或者数组中的最后一个char,将它添加到inVariable数组中,递增索引计数器并向数组添加零
b)如果char是&#39;:&#39;,做一些检查并从缓冲区中读取下一个字符作为数字,然后对其执行某些操作,然后运行cambioVariabiliSeriale
c)如果char是&#39 ;;&#39;,请运行cambioVariabiliSeriale并重置一些索引。
(另外,我不认为你需要检查inChar!=&#39;;&#39;当你在ifChar中检查if语句时==&#39;:& #39)
无法按以下方式运行,因此Serial.println(Serial.available());可以被注释掉而没有效果吗?
void checkSeriale(){
while(Serial.available() > 0){
Serial.println(Serial.available());
inChar = Serial.read();
if(inChar != ':' && index < arraySize-1 && inChar != ';'){
inVariable[index] = inChar;
index++;
inVariable[index] = '\0';
}
else if(inChar == ':'){
index = 0;
while(Serial.available() >0 && index < 10){
inDigit = Serial.read() - '0';
inNumber = inNumber * 10;
inNumber = inNumber + inDigit;
index++;
}
cambioVariabiliSeriale(inVariable);
}
else if if(inChar == ';'){
cambioVariabiliSeriale(inVariable);
inNumber=0;
inChar='0';
index=0;
}
}
}
我将一堆串行监视器打印件插入原始代码中以查看发生了什么 - 如果它对您有用,它就在这里。希望它有所帮助!
#define arraySize 32
char inChar = '0';
char inVariable[arraySize];
byte index = 0;
byte inDigit;
int inNumber;
int i; //counter
String repeatstring;
void setup(){
Serial.begin(9600);
}
void loop(){
checkSeriale();
}
void checkSeriale(){
while(Serial.available() > 0){
pr("Start of 'checkSeriale' function");
pr("Characters available in serial receive buffer: " + String(Serial.available()));
//Serial.println(Serial.available());
inChar = Serial.read();
pr("Read a char into InChar: " + String(inChar));
pr("Characters available after Serial.read(): " + String(Serial.available()));
if(inChar != ':' && index < arraySize-1 && inChar != ';'){
pr("First 'if' statement (inChar not equal to colon)");
inVariable[index] = inChar;
index++;
inVariable[index] = '\0';
for(i=0;i<sizeof(inVariable);i++){
Serial.print(String(inVariable[i]));
}
}
else{
pr("Else statement for first 'if', inChar equals colon hence break");
break;
}
}
if(inChar == ':'){
pr("Second 'if' statement (InChar is equal to colon)");
index = 0;
pr("Characters available in serial receive buffer: " + String(Serial.available()));
while(Serial.available() >0 && index < 10 && inChar != ';'){
inDigit = Serial.read() - '0';
pr("Characters available after Serial.read(): " + String(Serial.available()));
pr("inDigit: " + String(inDigit));
pr("inNumber: " + String(inNumber));
inNumber = inNumber * 10;
pr("inNumber * 10: " + String(inNumber));
inNumber = inNumber + inDigit;
pr("InNumber + inDigit : " + String(inNumber));
index++;
}
cambioVariabiliSeriale(inVariable);
}
if(inChar == ';'){
pr("third 'if' statement (inChar is equal to semicolon)");
cambioVariabiliSeriale(inVariable);
inNumber=0;
inChar='0';
index=0;
}
}
void cambioVariabiliSeriale(char test[]){
}
//simple debug technique - use pr("something"); in your code - askchipbug
void pr(String txt){
if(repeatstring != txt){
//if the debug text is different, print it
Serial.println(txt); //prints the text and adds a newline
delay(1000); //just pauses the scrolling text for 1 second, make bigger if you want a longer pause
repeatstring = txt;
}
}