Обмен данными между двумя UART

saniks
Offline
Зарегистрирован: 09.04.2013

Подскажите как дублировать данные между двумя UART, т.е. я ввожу данные в терминале, и они пересылаются на софтовый UART. В тоже время если на softwareSerial приходят данные, то они попадают ко мне в терминал. 

Вот такой код не работает, проверял замыкая 9 и 10 пин (Rx и Tx).

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 9); //Rx, Tx
void setup()  
{
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(10, INPUT);
  pinMode(9, OUTPUT);
}

void loop()
{
    if (Serial.available())
    {
     mySerial.print(Serial.read());
    }
    
  if (mySerial.available())
    {
     Serial.print(mySerial.read());
    }
    
 delay(10);
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

скажите а вы на что заливаете?

saniks
Offline
Зарегистрирован: 09.04.2013

На Arduino Uno

maksim
Offline
Зарегистрирован: 12.02.2012

SoftwareSerial.h не позволяет вести одновремено прием и передачу, так как прием (так же как и передача) является блокирующим, то есть PinChenge-прерывание используются только для отслеживания стартового бита, а сам прием построен на задержках:

void SoftwareSerial::recv()
{
  uint8_t d = 0;
  // If RX line is high, then we don't see any start bit
  // so interrupt is probably not for us
  if (_inverse_logic ? rx_pin_read() : !rx_pin_read())
  {
    // Wait approximately 1/2 of a bit width to "center" the sample
    tunedDelay(_rx_delay_centering);
    DebugPulse(_DEBUG_PIN2, 1);
    // Read each of the 8 bits
    for (uint8_t i=0x1; i; i <<= 1)
    {
      tunedDelay(_rx_delay_intrabit);
      DebugPulse(_DEBUG_PIN2, 1);
      uint8_t noti = ~i;
      if (rx_pin_read())
        d |= i;
      else // else clause added to ensure function timing is ~balanced
        d &= noti;
    }
    // skip the stop bit
    tunedDelay(_rx_delay_stopbit);
    DebugPulse(_DEBUG_PIN2, 1);
    if (_inverse_logic)
      d = ~d;
    // if buffer full, set the overflow flag and return
    if ((_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF != _receive_buffer_head) 
    {
      // save new data in buffer: tail points to where byte goes
      _receive_buffer[_receive_buffer_tail] = d; // save new byte
      _receive_buffer_tail = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF;
    } 
    else 
    {
      _buffer_overflow = true;
    }
  }

 

toc
Offline
Зарегистрирован: 09.02.2013

saniks, по-моему, в вашем скетче есть лишние строки: 07,08,23.

И попробуйте пример с этой странички http://arduino.cc/en/Reference/SoftwareSerial

maksim
Offline
Зарегистрирован: 12.02.2012

Данные строки ничего не меняют и проба примера не поможет.