Serial — отправляет данные в Arduino, пока Arduino отправляет данные

Arduino отправляет данные на ПК при каждой итерации. Когда я пытаюсь отправить данные в Arduino, получая от него данные, это занимает слишком много времени. Serial.available() возвращает false, даже если я отправил данные с ПК. Но если я добавлю задержку, например, 20-30 мс, проблема устранена. Могу ли я одновременно использовать последовательный порт?

PS: это мега Arduino, и я использую http://www.teuniz.net/RS-232/ библиотека для последовательной связи.

Пример кода:

void loop(){

  if(Serial.available())
    Serial.write("goodbye", 7);
    Serial.write("hello", 5);
  }

В этой ситуации требуется много времени, чтобы написать «до свидания» после того, как я отправил данные в Arduino.

, 👍2

Обсуждение

Пожалуйста, отредактируйте свой вопрос и опубликуйте свой код. Отформатируйте код, используя уценку форматирования кода (четыре начальных пробела). Для получения справки см. [Справка Markdown](http://meta.stackexchange.com/editing-help). Вы сможете сделать это, выбрав код и нажав Ctrl+K, чтобы ваш браузер сделал это за вас., @Nick Gammon

@Ник Гэммон, готово., @bca

Это не **весь** ваш код, не так ли? Какую скорость передачи вы используете? В любом случае, поскольку вы отправляете «привет» каждый раз в цикле, выходной буфер будет заполнен «привет» до того, как вы получите возможность вставить «до свидания». Ваше решение с «задержкой», вероятно, дает буферу вывода время для очистки., @Nick Gammon

@Ник Гэммон 9600., @bca

И я закрываю светодиод, когда получаю сообщение. Я забываю это написать. Я добавлю полный код, когда буду открывать ПК. У меня пока нет полного кода., @bca


2 ответа


1

В продолжение того, что говорит Ник Гэммон, не пытайтесь использовать последовательный вывод для отладки последовательного порта. Возможно, вместо этого попробуйте использовать встроенный светодиод; вы можете использовать осциллограф, чтобы узнать, сколько времени он тратит на чтение символов.

Вот как я читал строку за раз, используя неблокирующие операции:

const int SERIAL_BUFFER_LENGTH = 100;

// +1 гарантирует, что у нас всегда будет место для нулевого завершения
char g_serial_buffer[SERIAL_BUFFER_LENGTH+1];
int g_char_count;         // индекс в последовательный буфер

void setup() {
  Serial.begin(9600);  // или 115200, если ваш хост это поддерживает
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  g_char_count = 0;
}

void loop() {
  while(Serial.available() > 0) {
    digitalWrite(LED_BUILTIN, HIGH);
    char c = Serial.read();   // не будет блокироваться, потому что Serial.available() > 0
    if (c == '\n') {
      g_serial_buffer[g_char_count] = '\0';  // нулевое завершение
      process_buffer(g_serial_buffer);
      g_char_count = 0;
    } else if (g_char_count < SERIAL_BUFFER_LENGTH) {
      g_serial_buffer[g_char_count++] = c;
    }
  }
  digitalWrite(LED_BUILTIN, LOW);
  Serial.print(".");
}

// process_buffer: делайте все, что вы намеревались сделать с
// строка полученного текста...
void process_buffer(char *buffer) {
}
,

0

Попробуйте это:

  if(Serial.available())
    while(Serial.read());
    Serial.write("goodbye", 7);
    Serial.write("hello", 5);
  }

Я думаю, вы должны прочитать, что вы получаете в последовательном порту.

,