Arduino:Примеры/YunSerialTerminal

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Доступ к терминалу Linux через Serial Monitor (на Arduino Yun)[1]

Благодаря этому примеру вы научитесь использовать Yun’овский процессор 32U4 в качестве терминала для последовательной передачи данных в работе c Linux-процессором.

Загрузите этот скетч на Arduino Yun через USB (не через WiFi), а затем запустите последовательную передачу данных со скоростью 115200 бит/с, чтобы увидеть процесс начальной загрузки процессора Linux. Кроме того, в этом скетче Serial Monitor можно использовать в роли основного интерфейса командной строки для Linux.

Через Serial Monitor можно отправлять следующие команды:

  • «~», а затем «0» ---> Выставляем скорость работы UART в 57 600 бод.
  • «~», а затем «1» ---> Выставляем скорость работы UART в 115 200 бод.
  • «~», а затем «2» ---> Выставляем скорость работы UART в 250 000 бод.
  • «~», а затем «3» ---> Выставляем скорость работы UART в 500 000 бод.
  • «~», а затем «~» ---> Отправляем команду разрыва соединения.

Необходимое оборудование

  • Плата Arduino Yun;

Цепь

Для этого примера цепи строить не нужно.

Код

Создаем две переменные. В первой будем хранить информацию о скорости передачи данных между процессорами, а во второй – о том, вошли ли мы в командный режим (т.е. режим прямого ввода команд) или нет.

long linuxBaud = 250000;
boolean commandMode = false;

В секции setup() инициализируем последовательное соединение с компьютером и Linux.

void setup() {
  Serial.begin(115200);     
  Serial1.begin(linuxBaud); 
}

В секции loop() копируем данные из одного последовательного соединения в другое. Если нажата клавиша «~», включаем командный режим.

void loop() {
  // копируем информацию с USB-соединения на UART и наоборот
  if (Serial.available()) {           // есть ли какая-нибудь информация от USB-соединения? 
    char c = (char)Serial.read();     // считываем ее
    if (commandMode == false) {       // если мы не находимся в командном режиме...
      if (c == '~') {                 // если нажата клавиша «~»...
        commandMode = true;           // то входим в командный режим
      } else {
        Serial1.write(c);             // в противном случае передаем символ на Linux
      }
    } else {                          // если мы находимся в командном режиме...
      if (c == '0') {                 // если нажата клавиша «0»...
        Serial1.begin(57600);         // то устанавливаем скорость в 57600 бод
        Serial.println("Speed set to 57600");  // "Скорость установлена в 57500"
      } else if (c == '1') {          // если нажата клавиша «1»...
        Serial1.begin(115200);        // то устанавливаем скорость в 115200 бод
        Serial.println("Speed set to 115200");  // "Скорость установлена в 115200"
      } else if (c == '2') {          // если нажата клавиша «2»...
        Serial1.begin(250000);        // то устанавливаем скорость в 250000 бод
        Serial.println("Speed set to 250000");  // "Скорость установлена в 250000"
      } else if (c == '3') {          // если нажата клавиша «3»...
        Serial1.begin(500000);        // то устанавливаем скорость в 50000 бод
        Serial.println("Speed set to 500000");  // "Скорость установлена в 500000"
      } else if (c == '~') {
        Serial1.write((uint8_t *)"\xff\0\0\x05XXXXX\x0d\xaf", 11);
        Serial.println("Sending bridge's shutdown command");  // "Отсылаем команду разрыва соединения"
      } else {                        // нажата ли какая-нибудь другая клавиша?
        Serial1.write('~');           // передаем на Linux «~»
        Serial1.write(c);             // передаем символ на Linux
      }
      commandMode = false;            // в любом случае выходим из командного режима
    }
  }
  if (Serial1.available()) {          // есть ли какая-нибудь информация от Linux?         
    char c = (char)Serial1.read();    // считываем ее  
    Serial.write(c);                  // передаем на USB-соединение
  }
}

Весь код полностью – ниже:

/*
Передача информации с последовательного соединения на Linux (Yun)

Позволяет использовать Yun’овский процессор 32U4 в качестве терминала для последовательной передачи данных в работе c Linux-процессором.

Загрузите этот скетч на Arduino Yun через последовательный порт (не через WiFi),
а затем откройте Serial Monitor на скорости 115200, 
чтобы увидеть процесс начальной загрузки процессора Linux. 
Кроме того, в этом скетчеSerial Monitor можно использовать 
в качестве базового интерфейса командной строки для Linux.

Скетч настроен таким образом, что через Serial Monitor можно было давать следующие команды:

«~», а затем «0» ---> Выставляем скорость работы UART в 57 600 бод.
«~», а затем «1» ---> Выставляем скорость работы UART в 115 200 бод.
«~», а затем «2» ---> Выставляем скорость работы UART в 250 000 бод.
«~», а затем «3» ---> Выставляем скорость работы UART в 500 000 бод.
«~», а затем «~» ---> Отправляем команду разрыва соединения.

Цепь:
* Плата Arduino Yun

Создан в марте 2013 Массимо Банци (Massimo Banzi),
модифицирован Кристианом Мэгли (Cristian Maglie).

Этот код не защищен авторским правом.

*/

long linuxBaud = 250000;

void setup() {
  Serial.begin(115200);      // запускаем последовательную передачу данных через последовательный порт
  Serial1.begin(linuxBaud); // запускаем последовательную передачу данных на Linux
}

boolean commandMode = false;

void loop() {
  // копируем информацию с USB-соединения на UART и наоборот
  if (Serial.available()) {           // есть ли какая-нибудь информация от USB-соединения? 
    char c = (char)Serial.read();     // считываем ее
    if (commandMode == false) {       // если мы не находимся в командном режиме...
      if (c == '~') {                 // если нажата клавиша «~»...
        commandMode = true;           // то входим в командный режим
      } else {
        Serial1.write(c);             // в противном случае передаем символ на Linux
      }
    } else {                          // если мы находимся в командном режиме...
      if (c == '0') {                 // если нажата клавиша «0»...
        Serial1.begin(57600);         // то устанавливаем скорость в 57600 бод
        Serial.println("Speed set to 57600");  // "Скорость установлена в 57500"
      } else if (c == '1') {          // если нажата клавиша «1»...
        Serial1.begin(115200);        // то устанавливаем скорость в 115200 бод
        Serial.println("Speed set to 115200");  // "Скорость установлена в 115200"
      } else if (c == '2') {          // если нажата клавиша «2»...
        Serial1.begin(250000);        // то устанавливаем скорость в 250000 бод
        Serial.println("Speed set to 250000");  // "Скорость установлена в 250000"
      } else if (c == '3') {          // если нажата клавиша «3»...
        Serial1.begin(500000);        // то устанавливаем скорость в 50000 бод
        Serial.println("Speed set to 500000");  // "Скорость установлена в 500000"
      } else if (c == '~') {
        Serial1.write((uint8_t *)"\xff\0\0\x05XXXXX\x0d\xaf", 11);
        Serial.println("Sending bridge's shutdown command");  // "Отсылаем команду разрыва соединения"
      } else {                        // нажата ли какая-нибудь другая клавиша?
        Serial1.write('~');           // передаем на Linux «~»
        Serial1.write(c);             // передаем символ на Linux
      }
      commandMode = false;            // в любом случае выходим из командного режима
    }
  }
  if (Serial1.available()) {          // есть ли какая-нибудь информация от Linux?         
    char c = (char)Serial1.read();    // считываем ее  
    Serial.write(c);                  // передаем на USB-соединение
  }
}

См.также

Внешние ссылки