Как многократно брать несколько последовательных последовательных входов в Arduino? - PullRequest
0 голосов
/ 18 октября 2019

Я настраиваю программу управления шаговым двигателем, используя Arduino Mega 2560, и использую последовательное соединение USB от Raspberry Pi. Когда я запускаю свой код, мне бы хотелось, чтобы он имел два последовательных входа, начиная с множителя для вращения шаговых двигателей и затем команды для перемещения определенным образом. Затем эти входы можно использовать несколько раз, чтобы учесть разные множители и команды вращения.

В настоящее время у меня есть код для ввода ввода для множителя с маркерами начала и конца, например, <7.4>, а затем команда перемещенияНапример, 1. Это должно затем зациклить, как только команды будут выполнены, и снова взять множитель и команды.

Пример ввода будет <7.4>, а затем 1. Это должно обновить y и x, чтобы быть тем, что вывведены (в случае х без <>).

float steps;
int x;
const byte numChars = 32;
char recievedChars[numChars];
boolean newData = false;

void setup() {
  Serial.begin(9600);
  if(Serial.available() > 0){
    Serial.read();
  }
}

void loop() {
  recvWithStartEndMarkers();
  if(Serial.available() > 0) {
    x = Serial.read() - '0';
    Serial.println(x);
    float y = atof(recievedChars);
    steps = stepsPerRevolution * y;
    Serial.println(steps);
    // choice(); // This leads to the commands that run the steppers.
  }
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '<';
  char endMarker = '>';
  char rc;
  while (Serial.available() > 0 && newData == false) {
    rc = Serial.read();
    if (recvInProgress == true) {
      if (rc != endMarker) {
        recievedChars[ndx] = rc;
        ndx++;
        if (ndx >= numChars) {
          ndx = numChars -1;
        }
      }
      else {
        recievedChars[ndx] = '\0';
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }
    else if (rc == startMarker) {
      recvInProgress = true;
    }
  } 
}

Исходя из этого, ожидается, что я смогу ввести множитель, а затем команду, однако при запуске я не могу ввести секундумножитель после обеих команд, даже когда я форматирую его как '<' x '>' (не позволил бы мне использовать символы, так как 'обычно там не было), программа, кажется, просто читает x как команду, а не множитель.

Кроме того, иногда при запуске программа не будет принимать какие-либо входные данные до тех пор, пока не будут введены три или 4 числа, или примет множитель в качестве множителя и команды (так что ввод <3.4> будетвзять три в качестве множителя и 4 в качестве команды).

...