gpt4 book ai didi

c - Arduino sketch 的字符串命令有点工作但不是真的

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:13 25 4
gpt4 key购买 nike

所以我有一个 Arduino 草图,它读取串行命令(一串字符),然后让草图根据它接收到的命令执行某些操作。截至目前,我有两个命令,

  • {open_valve}
  • {close_valve}

当我向 Arduino 发送命令 {open_valve} 时,阀门打开正常,但是当我向 Arduino 发送命令 {close_valve} 时阀门没有关闭。草图如下所示,

 // flow_A LED
int led = 4;

// relay_A
const int RELAY_A = A0;

// variables from sketch example
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete

// variables from SO thread
boolean LED_state = false;
boolean vavle_open = false;

// flowmeter shit
unsigned long totalCount = 0;
unsigned long previousCount = 0;
int pin = 2;
unsigned long duration;

// storage variable for the timer
unsigned long previousMillis=0;
int interval=1000; //in milliseconds

// counters for each flowmeter
unsigned long countA = 0;

void setup() {

Serial.begin(115200); // open serial port, sets data rate to 115200bps
Serial.println("Power on test");
inputString.reserve(200);

pinMode(RELAY_A, OUTPUT);

// flowmeter shit
pinMode(pin, INPUT);

}

void open_valve() {

digitalWrite(RELAY_A, HIGH); // turn RELAY_A on

// set the boolean value for "vavle_open" to true
//valve_open = true;
Serial.println("Valve Open");

}

void close_valve() {
Serial.println("2");
digitalWrite(RELAY_A, LOW); // turn RELAY_A off
//valve_open = false;
Serial.println("3");
Serial.println("Vavle Closed");
}

void controlValve(bool open)
{

}

void flow_A_blink() {

digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for one second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}

void flow_A_blink_stop() {

digitalWrite(led, LOW);
}

void getFlow() {

duration = pulseIn(pin, HIGH);
Serial.print(duration);
Serial.println("");
delay(200);
}

/*
* Main program loop, runs over and over repeatedly
*/

void loop() {
if(checkForCorrectCommand("{open_valve}") == true) {
open_valve();
Serial.println("OPENING");
getFlow();
}
else if(checkForCorrectCommand("{close_valve}") == true)
{
close_valve();
Serial.println("CLOSING");
}
}

bool checkForCorrectCommand(String cmd) {

//Serial.println(inputString);
//Serial.println(cmd);

if(inputString == cmd) {
// reset String variables for serial data commands
Serial.println("1");
inputString = "";
stringComplete = false;
return true;
// reset String variables for serial data commands
inputString = "";
stringComplete = false;
return false;
}
}

//SerialEvent occurs whenever a new data comes in the
//hardware serial RX. This routine is run between each
//time loop() runs, so using delay inside loop can delay
//response. Multiple bytes of data may be available.

void serialEvent() {
while(Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
stringComplete = true;
}
}
}

最佳答案

您的代码不应像此处粘贴的那样编译。 checkForCorrectCommand 函数没有匹配和不匹配的返回值。您的代码显示您打算为匹配和不匹配的情况清空 inputString 缓冲区。如果字符串匹配不正确,您希望保持输入缓冲区不变,以便可以运行以下测试用例。

bool checkForCorrectCommand(String cmd) {  

if(inputString == cmd) {
// for match case, the string is consumed from the buffer
inputString = "";
stringComplete = false;
return true;
}
else {
// for the non-match case, leave the buffer for further Rx or further tests
return false;
}

关于c - Arduino sketch 的字符串命令有点工作但不是真的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17537757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com