В очередной раз Xbee

Тема в разделе "Arduino & Shields", создана пользователем Vir, 10 фев 2013.

  1. Vir

    Vir Гик

    Всем привет.

    У меня есть два XBee модуля. Один подключен к Arduino Mega (работает как END DEVICE/ROUTER AT), а другой подключен к компьютеру (работает как COORDINTATOR AT).

    На ардуино у меня выполняется следующий скетч:
    Код (Text):
    void setup()
    {
      Serial.begin(9600);
      Serial1.begin(9600);
    }
     
    void loop()
    {
      if (Serial1.available())
      {
        char incoming = Serial1.read();
        Serial.print("Serial1 data: ");
        Serial.println(incoming);
      }
     
      Serial.println("cycle");
     
      if (Serial.available())
      {
        Serial1.print("Serial data: ");
        Serial1.println(Serial.read());
      }
     
      delay(1000);
    }
    Далее, я запускаю скетч, а на компьютере (к которому подключен координатор) записываю в порт данные:
    Код (Text):
    vir@laptop:~$ echo fuck >> /dev/ttyACM1
    Результат (на serial monitor'е), я получаю, следующий:
    Код (Text):
    cycle
    cycle
    cycle
    cycle
    cycle
    Serial1 data: f
    cycle
    Serial1 data: u
    cycle
    Serial1 data: c
    cycle
    Serial1 data: k
    cycle
    Serial1 data:
     
    cycle
    Serial1 data:
     
    cycle
    cycle
    cycle
    cycle
    cycle
    Собственно вопрос, почему данные приходят по одному символу, т.е. считываются по одному за цикл (loop)? Почему я не получаю слово целиком? И откуда беруться два пустых символа?
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Не успевают просто за раз прийти. Это нормально. Вы можете настроить /dev/ttyACM0 через `stty` так, что флашиться он будет сразу со всей строкой.

    А что касается двух пустых символов, полагаю что это \r и \n. Т.е. перенос строки, который добавляет `echo`
     
  3. HighDigital

    HighDigital Гик

    а можно попробовать пошаманить с delay();, но боюсь это потеря времни...
     
  4. Попробуйте
    if (Serial1.available())
    заменить на
    while (Serial1.available())
     
  5. hibiki

    hibiki Гик

    и делайте echo -n fuck, тогда не будет CRLF
     
  6. Vir

    Vir Гик

    Всем спасибо. В который раз, беда в моей невнимательности. Как тут уже сказали, вместо if'а, нужно было использовать while.

    А за echo -n - спасибо.