skilful 0 16 июля, 2020 Опубликовано 16 июля, 2020 · Жалоба Здравствуйте. В 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 держать рядом друг с дружкой :) ? Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 16 июля, 2020 Опубликовано 16 июля, 2020 · Жалоба Полнодуплексный программно-аппаратный UART можно организовать средствами таймера 1 - передача с помощью одного из компараторов таймера, семплер приема - с помощью другого, а запуск приема - по ICP. Как это реализовать средствами arduino - не подскажу, на .asm - достаточно тривиально. 2. - ошибка в битовых скоростях до 2% некритична и на надежности передачи данных не сказывается (она нивелируется при запуске приема каждого байта). Но по возможности ее лучше минимизировать (0.2% - это просто великолепно, все, что лучше 1% - хорошо). 3. Не стоит этого делать, хотя вероятнее всего работать будет. Но длинные линии - потенциальный источник "звонов", и к чему это может привести - не очень предсказуемо. Запросто ложные срабатывания приемника, "мусор". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 18 17 июля, 2020 Опубликовано 17 июля, 2020 · Жалоба 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 (вот еще один такой) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться