Перейти к содержанию
    

Пересылка uart-uart одного МК (ардуино); и вопросы по uart

Здравствуйте.

В Arduino Pro Mini (5В 16 МГц) имеется только 1 аппаратный uart.

Мне нужно 2: uart1 и uart2. Скорость 9600. Причем, в некоторый момент работы схемы пересылать данные из uart1 в uart2 и наоборот. 

Можно, наверное, мультиплексировать транзисторами линии, но можно ли это сделать средствами самого МК без внешней обвязки?

На сайте Arduino предлагается следующий код:

#include <SoftwareSerial.h>
// software serial #1: RX = digital pin 10, TX = digital pin 11
SoftwareSerial portOne(10, 11);

// software serial #2: RX = digital pin 8, TX = digital pin 9
// on the Mega, use other pins instead, since 8 and 9 don't work on the Mega
SoftwareSerial portTwo(8, 9);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // Start each software serial port
  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop() {
  // By default, the last intialized port is listening.
  // when you want to listen on a port, explicitly select it:
  portOne.listen();
  Serial.println("Data from port one:");
  // while there is data coming in, read it
  // and send to the hardware serial port:
  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  // blank line to separate data from the two ports:
  Serial.println();

  // Now listen on the second port
  portTwo.listen();
  // while there is data coming in, read it
  // and send to the hardware serial port:
  Serial.println("Data from port two:");
  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }

  // blank line to separate data from the two ports:
  Serial.println();
}

но он пишут может "пропускать" часть данных. 

Если МК у меня простаивает в момент передачи между uart1 и uart2, и я хочу организовать пересылку между uart-ами просто в цикле:

п.1) прочитать состояние ножки rx uart1

п.2) выставить значение, прочитанное из п.1) на tx uart2

п.3) прочитать состояние ножки rx uart2

п.4) выставить значение, прочитанное из п.3) на tx uart1

1. Не будет ли тут ошибки реализации? МК на 16 МГц работает, а скорость uart существенно ниже. Криминала не вижу, но может есть?

2. В Arduino используются кварцы с целым значением частоты. Я посмотрел калькулятор uart. Погрешность uart не превышает 0.2% для скорости 9600 и кварц 16 МГц. Находится в зеленой зоне. Как это отражается на данных uart, если аппаратным пользоваться?

Это значит, что мне нужно иметь ввиду, что не исключены ошибки в данных и их необходимо вылавливать? Или раз такая низкая погрешность - не обращать на это внимание?

3. Можно ли бросить utp шнурок от МК до микросхемы MAX232 длиной метр или это рискованно и лучше МК и MAX232 держать рядом друг с дружкой :) ?

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Полнодуплексный программно-аппаратный UART можно организовать средствами таймера 1 - передача с помощью одного из компараторов таймера, семплер приема - с помощью другого, а запуск приема - по ICP. Как это реализовать средствами arduino - не подскажу, на .asm - достаточно тривиально.

 

2. - ошибка в битовых скоростях до 2% некритична и на надежности передачи данных не сказывается (она нивелируется при запуске приема каждого байта). Но по возможности ее лучше минимизировать (0.2% - это просто великолепно, все, что лучше 1% - хорошо).

 

3. Не стоит этого делать, хотя вероятнее всего работать будет. Но длинные линии - потенциальный источник "звонов", и к чему это может привести - не очень предсказуемо. Запросто ложные срабатывания приемника, "мусор".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, skilful said:

В Arduino Pro Mini (5В 16 МГц) имеется только 1 аппаратный uart.

Мне нужно 2: uart1 и uart2. Скорость 9600. Причем, в некоторый момент работы схемы пересылать данные из uart1 в uart2 и наоборот.

 

Выпаять микроконтроллер Atmega328 и впаять  Atmega328PB взамен, в нем два UART-а. Или купить готовый Arduino Pro Mini с уже запаянным 328PB (вот еще один такой)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...