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

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

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

Пример кода:

 void loop(){

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

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

3 голоса | спросил thoron 21 WedEurope/Moscow2016-12-21T03:18:44+03:00Europe/Moscow12bEurope/MoscowWed, 21 Dec 2016 03:18:44 +0300 2016, 03:18:44

2 ответа


0

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

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

const int SERIAL_BUFFER_LENGTH = 100;

// The +1 assures we'll always have room for null termination
char g_serial_buffer[SERIAL_BUFFER_LENGTH+1];
int g_char_count;         // index into serial buffer

void setup() {
  Serial.begin(9600);  // or 115200 if your host supports it
  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();   // won't block because Serial.available() > 0
    if (c == '\n') {
      g_serial_buffer[g_char_count] = '\0';  // null terminate
      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: do whatever it is you intended to do with a 
// line of received text...
void process_buffer(char *buffer) {
}
ответил fearless_fool 21 WedEurope/Moscow2016-12-21T09:38:49+03:00Europe/Moscow12bEurope/MoscowWed, 21 Dec 2016 09:38:49 +0300 2016, 09:38:49
0

Попробуйте следующее:

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

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

ответил 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 08 Sep 2017 13:01:23 +0300 2017, 13:01:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132