Arduino mega отсылка и прием сообщений от роутера (UART) через serial

reswem
Offline
Зарегистрирован: 26.01.2013

Здравствуйте, помогите разобраться с проблемой. Есть код:

#include <SoftwareSerial.h>

SoftwareSerial comSerial1(18,19);
SoftwareSerial comSerial(0,1);

char s;
char incByte;  // входящие данные
int  iLED = 13;      // LED подключен к 13 пину

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

  pinMode(iLED, OUTPUT);
  Serial.print("START:");
}

void loop()
{
  //if (Serial1.available()) { // прием данных от устройства
  // int incByte = Serial1.read();
  
  if (Serial1.available())  // прием данных от устройства
  {
    delay(100); // задержка перед выводом сообщений на комп
    while (Serial1.available() > 0) 
    {
    char s=Serial1.read();
      
      Serial.println(s);  // вывод на комп
    }
  }

  if (Serial.available()) { // ввод данных с компа
    char incByte = Serial.read();
    Serial1.print(incByte); // передача на устройство



    //  Serial1.flush(); // ожидание завершения передачи кода
    // if ()   {digitalWrite(iLED, HIGH);}
  }
}
/*
if (Serial.available() > 0) //если есть доступные данные
 {
 char incByte = Serial.read(); // считываем байт
 Serial.println(incByte); // отсылаем то, что получили
 }
 */

Весь текст который приходит - крякозябры. Помогите разобраться?

step962
Offline
Зарегистрирован: 23.05.2011

1. А кто вас знает - может быть на компьютере вы COM-порты настроили неправильно
2. А кто вас знает - может быть вы используете не старшие модели Arduino, у которых несколько аппаратных UART'ов, а программный UART? И если это так, то:
3. А вы уверены, что программный UART может стабильно поддерживать скорости, большие 4800-9600 бод?
4. А даже если вы только через аппаратные UART'ы работаете, то, может быть у вас соединение метровыми проводками прокинуто.

В общем, не жмитесь - раскрывайте все свои ноу-хау. Тогда, может быть, кто-нибудь что-нибудь конкретное и скажет.

 

ЗЫ. Любопытство нарастает прямо-таки по экспоненте: а вот зачем у вас в строках 3-4 вроде бы программные UART'ы создаются, а в setup'е - как бы предопределенные аппаратные инициализируются? 

paf
Offline
Зарегистрирован: 25.01.2013

 Ах, как все правильно начиналось! Но, вот к чему приводит нескрываемое любопытство! Теперь получены все ответы и мы ничего не узнаем... 

 

reswem
Offline
Зарегистрирован: 26.01.2013

Здравствуйте, Вы задаете такие вопросы, на которые я еще ответов не знаю. Недавно только приобрел.

У меня Arduino mega 2560 R3, на сколько я понимаю он поддерживает serial-соединение (UART) на пинах 0,1, 18,19 и 20,21. Знаю что можно подключать к нему устройства, но не знаю програмная поддержка или аппаратная(!) COM. Для работы с роутером написанно что скорость должна быть 115200 бод. Какую скорость поддерживает ардуино (или библиотека?).

Суть задачи простая. Поставил на роутер (wr1043nd) openwrt, и случайно снес загрузчик, можно восстановить только по (UART-TTL), как я понял, это можно сделать с помощью ардуино.

SoftwareSerial comSerial1(18,19);
SoftwareSerial comSerial(0,1);

Получается, программные надо удалить, раз в setup есть. Видимо я не так понял, посчитал что если он поддерживает несколько serial-соединений, то ему надо указать с каким именно соединением (пинами) работать.

Суть: Мне надо отсылать команды на роутер и принимать в окне терминала. Но сколько не пробовал, у меня только под или иероглифы. Как исправить кодировку, я не знаю (ASCII?).

reswem
Offline
Зарегистрирован: 26.01.2013
void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
}
void loop()
{
if (Serial1.available())
Serial.write(Serial1.read());
if (Serial.available())
Serial1.write(Serial.read());
}

Для работы с serial-соединением (UART) для чтения параметров надо использовать Serial.write или Serial.print?

 

reswem
Offline
Зарегистрирован: 26.01.2013

Проблема решена, привожу свой код:

//#include <SoftwareSerial.h>

char s;
char incByte; // входящие данные
int iLED = 13; // LED подключен к 13 пину

void setup()
{
Serial.begin(115200); //Скорость портов
Serial1.begin(115200); // —----||-----

pinMode(iLED, OUTPUT);
Serial.print("START:");
}

void loop()
{
digitalWrite(iLED, LOW);
/* \*********************Устройство - комп*********************************/
if (Serial1.available() > 0) // прием данных от устройства
{
delay(5); // задержка перед выводом сообщений на комп
while (Serial1.available())
{
char s = Serial1.read();
Serial.write(s); // WRITE! вывод на комп
}
}
else
{
digitalWrite(iLED, HIGH);
}

/***********************Обратная связь: Комп - устройство********************/
if (Serial.available()) { // ввод данных с компа
char incByte = Serial.read();
Serial1.print(incByte); // передача на устройство
}
}

 

bvv4364
Offline
Зарегистрирован: 15.10.2013

Помоему в этом рабочий код.

 

bvv4364
Offline
Зарегистрирован: 15.10.2013

Ага вА почему есть уверенность в том что грузиться надо через уарт а не эс пи ай или еженедельну.