Последовательный порт не читает буфер с целочисленными символами больше 43

Я пытаюсь написать сценарий для перемещения объекта, связанного с линейной осью, с помощью шагового двигателя. Пользователь должен отправить такую информацию, как длина для перемещения, скорость движения, направление движения или даже если он захочет внесите миллиметровые корректировки с помощью serial. Однако Я не могу прочитать длины от 43 мм, когда я отправляю целое число 43 по последовательному порту. Я протестировал несколько методов, которые нашел в Интернете. Ниже приведен текущий код и некоторые альтернативы раздела последовательного чтения, в котором произошел сбой.

void(* resetFunc) (void) = 0;

//Последовательное чтение
const int bufferSize = 30; // Максимальное таманьо для свободного буфера
char buffer[bufferSize];   // Буфер для передачи данных через последовательный порт

//Шаговой двигатель
const int stepPin = 3;
const int senPin = 2;
const int enPin = 8;
int sen, sp, len, ad; //sen = вперед или назад, sp = скорость, len = длина, ad = включить шаги регулировки
int REV;//обороты двигателя
int time_motor; // интервал импульса (вкл/выкл)

void setup()

{
  
  pinMode(stepPin,OUTPUT); 
  pinMode(senPin,OUTPUT);
  pinMode(enPin,OUTPUT);
  digitalWrite(enPin,LOW);
  
  Serial.begin(9600);
 
  while (!Serial.available()) {
    delay(10);
  }

  int bytesRead = Serial.readBytesUntil('\n', buffer, bufferSize);

  buffer[bytesRead] = '\0';

  sscanf(buffer, "%d,%d,%d,%d", &ad, &sen, &len, &sp);

  Serial.print("ad: ");
  Serial.println(ad);
  Serial.print("sen: ");
  Serial.println(sen);
  Serial.print("len: ");
  Serial.println(len);
  Serial.print("sp: ");
  Serial.println(sp);
      
  time_motor = 100;
        
  REV = int(768 * len);
  
  if(ad == 0){   
    if (sen == 1){
      backward(REV, time_motor);
      }
  
    else {
      forward(REV, time_motor);
      }
  
      resetFunc();
  }
  else{
    if(sen == 1){backward(768, time_motor);resetFunc();}
    else{forward(768, time_motor);resetFunc();}
  }
}

void forward(int len_fact, int time_c) {
  digitalWrite(enPin, LOW);
  digitalWrite(senPin, HIGH);
  for (int x = 0; x < len_fact; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(time_c);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(time_c);
  }
}

void backward(int len_fact, int time_c) {
  digitalWrite(enPin, LOW);
  digitalWrite(senPin, LOW);
  for (int x = 0; x < len_fact; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(time_c);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(time_c);
  }
}


void loop()
{

}

Альтернатива ниже:

  while (!Serial.available()) {
    // Подождем, пока данные не станут доступны на последовательном порту
  }

  delay(100); // Небольшая задержка, чтобы убедиться, что все данные доставлены

  int bytesRead = 0;
  while (Serial.available() && bytesRead < bufferSize - 1) {
    char c = Serial.read();
    if (c == '\n') {
      break; // Завершаем чтение, когда обнаружен разрыв строки
    }
    buffer[bytesRead] = c;
    bytesRead++;
  }

  // Добавляем нулевой символ, обозначающий конец строки
  buffer[bytesRead] = '\0';

  // Используйте функцию sscanf для извлечения чисел из буфера
  sscanf(buffer, "%d,%d,%d,%d", &ad, &dir, &len, &sp);

  // Распечатываем прочитанные значения, чтобы их проверить
  Serial.print("ad: ");
  Serial.println(ad);
  Serial.print("dir: ");
  Serial.println(dir);
  Serial.print("len: ");
  Serial.println(len);
  Serial.print("sp: ");
  Serial.println(sp);

И остальные:

  while (!Serial.available()) {
    // Подождем, пока данные не станут доступны на последовательном порту
  }

  // Считывает данные из последовательного порта и сохраняет их в буфере, пока они не достигнут максимального размера
  int bytesRead = 0;
  while (bytesRead < bufferSize - 1) {
    if (Serial.available()) {
      char c = Serial.read();
      if (c == '\n') {
        break; // Завершаем чтение, когда обнаружен разрыв строки
      }
      buffer[bytesRead] = c;
      bytesRead++;
    }
  }

  // Добавляем нулевой символ, обозначающий конец строки
  buffer[bytesRead] = '\0';

  // Используем функцию сканирования для извлечения чисел из буфера
  sscanf(buffer, "%d,%d,%d,%d", &ad, &dir, &len, &sp);

  // Вывести значения значений для проверки
  Serial.print("ad: ");
  Serial.println(ad);
  Serial.print("dir: ");
  Serial.println(dir);
  Serial.print("len: ");
  Serial.println(len);
  Serial.print("sp: ");
  Serial.println(sp);

Последовательный интерфейс ничего не возвращает или возвращает «?». Как мне действовать, чтобы решить эту проблему? Я использую оригинальную Arduino Uno и пишу в Arduino IDE. Версия 1.8.19.

, 👍-1

Обсуждение

возможно, вы установили неправильную скорость передачи данных в последовательной консоли, @jsotola

сократите свою программу. к минимальному коду, который все еще демонстрирует проблему, @jsotola

Вы отправляете 4 номера по серийному номеру, верно? Пожалуйста, скопируйте и вставьте точные цифры, которые вы отправляете., @Nick Gammon

Перед sscanf я бы распечатал то, что находится в этом буфере., @Nick Gammon


1 ответ


0

Ну, вы предоставили не так много информации, но я взял часть вашего кода (ниже) и на последовательном мониторе могу прочитать все цифры:

    const int bufferSize = 30; // Максимальное таманьо для свободного буфера
char buffer[bufferSize];   // Буфер для передачи данных через последовательный порт

//Шаговой двигатель
const int stepPin = 3;
const int senPin = 2;
const int enPin = 8;
int dir, sp, len, ad; //sen = вперед или назад, sp = скорость, len = длина, ad = включить шаги регулировки
int REV;//обороты двигателя
int time_motor; // интервал импульса (вкл/выкл)

void setup() {
  // поместите сюда свой код установки для однократного запуска:
  Serial.begin(9600);
}

void loop() {
  // поместите сюда свой основной код для многократного запуска:
while (!Serial.available()) {
    // Подождем, пока данные не станут доступны на последовательном порту
  }

  delay(100); // Небольшая задержка, чтобы убедиться, что все данные доставлены

  int bytesRead = 0;
  while (Serial.available() && bytesRead < bufferSize - 1) {
    char c = Serial.read();
    if (c == '\n') {
      break; // Завершаем чтение, когда обнаружен разрыв строки
    }
    buffer[bytesRead] = c;
    bytesRead++;
  }

  Serial.println(buffer);

  // Добавляем нулевой символ, обозначающий конец строки
  buffer[bytesRead] = '\0';

  // Используйте функцию sscanf для извлечения чисел из буфера
  sscanf(buffer, "%d,%d,%d,%d", &ad, &dir, &len, &sp);

  // Распечатываем прочитанные значения, чтобы их проверить
  Serial.print("ad: ");
  Serial.println(ad);
  Serial.print("dir: ");
  Serial.println(dir);
  Serial.print("len: ");
  Serial.println(len);
  Serial.print("sp: ");
  Serial.println(sp);
}

,