Arduino Mega в качестве usb-serial конвертера

stranger
Offline
Зарегистрирован: 09.10.2012

Нужно было прошить роутер через консольный порт, набросал скетч для ардуины.
Если кому понадобится: pastebin.com

stranger
Offline
Зарегистрирован: 09.10.2012

ТОЛЬКО ARDUINO MEGA!

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

Во-первых, ваш код нерабочий, потому что... где у вас в коде происходит проверка буфера и чтение данных из него? или другими словами - когда у вас в коде вызываются функции serialEvent() и serialEvent1()?
Во-вторых, все гараздо проще:

void setup()  
{
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop()
{
  if (Serial1.available())
    Serial.write(Serial1.read());
  if (Serial.available())
    Serial1.write(Serial.read());
}

 

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

stranger пишет:

ТОЛЬКО ARDUINO MEGA!

Не только, а еще и Leonardo и Micro, потому как они имеют помимо обычного UARTа еще и USB-UART.

stranger
Offline
Зарегистрирован: 09.10.2012

maksim пишет:

Во-первых, ваш код нерабочий, потому что... где у вас в коде происходит проверка буфера и чтение данных из него? или другими словами - когда у вас в коде вызываются функции serialEvent() и serialEvent1()?
Во-вторых, все гараздо проще:



void setup()  
{
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop()
{
  if (Serial1.available())
    Serial.write(Serial1.read());
  if (Serial.available())
    Serial1.write(Serial.read());
}

 

Я просто оставлю это здесь http://arduino.cc/en/Reference/SerialEvent

stranger
Offline
Зарегистрирован: 09.10.2012

А еще, многопоточность это офигенно и именно поэтому я использовал ивенты а не просто read-write

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

Да, извиняюсь, не знал о такой дуиновской функции.

Если для вас это "многопоточность", то огорчу вас - в способе "read-write" она тоже есть, (не в явном виде) потому как дуина и так работает с UARTом и копит данные в буфере по прерыванию, так что, перемещая эти данные из буфера в свою переменную и выводя эти данные по приходу символа '\n'вы просто все данные пропускаете через еще один буфер с задержкой, тем самым только замедлив и усложнив решение простой задачи и не более того.
Плюс к тому, если не встретится символ 
'\n', то что произойдет с вашей программой? Переменные inputString0 и inputString1 будут заполняться, и больше ничего и к чему это приведет?

Так что смысла и пользы в таких манипуляциях нет. Велосипед уже изобретен и третяя педаль только мешается.

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

stranger пишет:

Нужно было прошить роутер через консольный порт, набросал скетч для ардуины.
Если кому понадобится: pastebin.com

 

А можете описать сам процесс, перешивки роутера?

Роутер подключается к UART?

Чем льете прошивку?

Для меня актуально , так как делаю шилд на базе роутера wr703n для меги.

10 строчка кода вроде как лишнее, или встаки чтото там пропустили?

stranger
Offline
Зарегистрирован: 09.10.2012

Да, вы тоже правы, но мне как-то с ивентами нагляднее было...

stranger
Offline
Зарегистрирован: 09.10.2012

NE_XT пишет:

stranger пишет:

Нужно было прошить роутер через консольный порт, набросал скетч для ардуины.
Если кому понадобится: pastebin.com

 

А можете описать сам процесс, перешивки роутера?

Роутер подключается к UART?

Чем льете прошивку?

Для меня актуально , так как делаю шилд на базе роутера wr703n для меги.

10 строчка кода вроде как лишнее, или встаки чтото там пропустили?

Роутер(TL-WDR4300) шил по этой инструкции, я его брикнул нечаяно. Подключал по Serial. Прошивку лил бутлоадером. И да, 10-я строчка - это трап;)

leshak
Offline
Зарегистрирован: 29.09.2011

 

maksim пишет:

Так что смысла и пользы в таких манипуляциях нет. Велосипед уже изобретен и третяя педаль только мешается.

Ага. Причем в  File/Examples/SoftwareSerial/SoftwareSerialExample он даже уже есть на винте у любого ардуинщика. И будет работать на любой дуине не только Mega (это вообщем-то есть код который дал Максим в #2, только используется не аппаратный, а софтверный сериал).

Я не хочу сказать что ТС сделал что-то плохое. Молодец. С event-тами разобрался, со строками, немного, с людьми кодом поделился (только неясно почему через pastebin, а не через встроенную функцию вставки кода).

Просто если вдруг "кому потребуется" (или у него меги нет) - есть более простой путь. "Из коробки".

stranger
Offline
Зарегистрирован: 09.10.2012

В чем проблема-то? Была задача, была ардуина, была ночь, было пиво, было время. Задача выполнена, все довольны. Выложил сюда, мало ли понадобиться кому-нибудь. Спасибо Максиму за более простой вариант, он тоже имеет место быть.

leshak
Offline
Зарегистрирован: 29.09.2011

 

stranger пишет:

В чем проблема-то? Была задача, была ардуина, была ночь, было пиво, было время. Задача выполнена, все довольны. Выложил сюда, мало ли понадобиться кому-нибудь. Спасибо Максиму за более простой вариант, он тоже имеет место быть.

Да чего вы? Я же специально оговорил "Я не хочу сказать что ТС сделал что-то плохое". Все правильно вы сделали. Нет никакой проблемы. Все-бы так поступали - здорово-бы было. Есть проблема - пошел читать доки (а не ныть "дайте мне готовое"), нашел рабочие решение - поделился.

Дальше обсудили, нашли альтернативы. Что плохого? На то это и форум.

 Для вас задача решена, но ветка может пригодится еще другим. Кто будет искать решение после вас. Увидят что не только мегу можно для этого использовать. Может кто-то узнает что ArduinoIDE идут стандартные примеры, тоже полезно знать.

Еще раз - никто не пытался бросить камень в ваш огород или высмеять. Все правильно, с вашей стороны, было сделано.

Вообщем похоже вы увидили "наезд" там где его небыло :) Не. Вам показалось. Мир-дружба-жвачка :)

stranger
Offline
Зарегистрирован: 09.10.2012

Я очевидно вам ответил, наезд был со стороны Максима, про велосипед и т.п.

leshak
Offline
Зарегистрирован: 29.09.2011

stranger пишет:

Я очевидно вам ответил, наезд был со стороны Максима, про велосипед и т.п.

И все равно "зря наезд увидели". "Написать велосипед" - это вообщем-то, в програмерском сленге - устоявшийся термин, а не "образ". Без негативной окраски.  Означает "самостоятельную реализацию того для чего есть известное/популярное решение". "Изобретают велосипеды" - все и постоянно. Без этого - никак. По разным причинам "не знал" (не возможно все знать, следить за всеми популярными библиотеками"), хотел "сделать лучше", в "учебных целях", "было быстрее написать чем искать", "хотел большего контроля за кодом" и т.д. и т.п. Ни один практикующий программер - не обходится без "велосипедатворчества" :) Иногда случайно, иногда сознательно на это идет. Негативом это становится только когда приобретает "болезненые масштабы" (как и любое излишество) и пытаются "сам напишу", ну буквально все.

Так что максим просто назвал суть "софтового буффера над аппаратным". Но все равно - это полезно. Вот в соседних ветках уже отсылают смотреть на ваше решение. Как пример "чтение из сериал в буферную строку". Это может быть полезным и в других ситуациях, не только для вашей задачи. И там это будет "не велосипедом", а "полезным примером" ;)

stranger
Offline
Зарегистрирован: 09.10.2012

Интересно было читать ваш пост, я, к слову сказать, прекрасно знаю что такое велосипед, в программистском сленге, я - сисадмин по образованию и по профессии. Мне все это знакомо... Просто ув. Максим высказался так, как-будто все что я делаю никому не сдалось, а вот то что он написал - это догма... Может я как-то криво его понял...

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

В общем-то улавливается "нотка наезда", но все-таки больше не наезд, а веский аргумент в ответ на сообщение #5.

stranger
Offline
Зарегистрирован: 09.10.2012

В свою очередь, сообщение #5 было вполне весомым аргументом в ответ на, немного некомпетентное, сообщение #2. Я вполне доходчиво объяснил почему использовал именно эти средства. Давайте прикратим flood ибо ни к чему хорошему это не приведет... Я тоже многое узнал про софтварный буфер благодаря вашему сообщению, вы узнали про ивенты, все счастливы - все довольны...

leshak
Offline
Зарегистрирован: 29.09.2011

 

stranger пишет:

Интересно было читать ваш пост, я, к слову сказать, прекрасно знаю что такое велосипед, в программистском сленге, я - сисадмин по образованию и по профессии. Мне все это знакомо... 

Да. Че-то я не подумал и полез лекцию читать. Мог-бы и сам догадатся по фразе "с ивентами наглядней/привычней" :)

stranger пишет:

Просто ув. Максим высказался так, как-будто все что я делаю никому не сдалось, а вот то что он написал - это догма... Может я как-то криво его понял...

Ладно. Все живы, все счастливы :) Издержки невербального общения. При личном разговоре мы 80% передаем итонациями/жестами/позой. А тут все это теряется. И то что писалось как "просто фраза" или "легкая ирония", может оказатся прочитанной в совсем другом ключе. И никто не виноват. Ни тот кто читал, ни тот кто писал. 

P.S. Хе... вот со стороны "менторить" - оно так просто. Видно кто что сказал, кто в чем ошибся. А ведь сам тоже, порой, тут, завожусь не на шутку от "неправильно проскользнувшей интонации" :) и включаю говномет на полную катушку :) Вы еще и "плавно" ответили на "наезд" ;)

stranger
Offline
Зарегистрирован: 09.10.2012

Ну а что, как говорится, на дураков обижаться:)

Sevas55
Offline
Зарегистрирован: 10.02.2013

Тема вроде подходящая. 

Пытаюсь использовать Ардуино(Mega1280) как USART-приёмник для другой меги 8535, которую программирую в CVAvr, и заливаю отдельным программатором.

Код для 8535, согласно даташиту (в CVAvr):



















#include <mega8535.h>
#include <delay.h>
#include <stdio.h>


void USART_Init(unsigned int baud)
{
    
    UBRRH = (unsigned char) (baud >> 8);
    UBRRL = (unsigned char) baud;
    UCSRB = (1 << RXEN) | (1 << TXEN);
    UCSRC = (1 << USBS) | (3 << UCSZ0);
   
}


void main(void) {

    USART_Init(155);

    while (1) {       
        while(! (UCSRA & (1 << UDRE)) );
        UDR = 110;
    };
}


На принимающей стороне-Ардуино пытаюсь получить сигнал вот так.

















void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);
}

void loop() {
    Serial2.write('t');
    if (Serial1.available())
    Serial.write(Serial1.read());
    Serial.write('\n'); 
}

В схеме подключения уверен, выход меги8535 №15 (TxD) на вход Ардуино №19(Rx1-Serial1)

Но в итоге в Serial-мониторе пустота.

Если не использовать Serial1.available(), а просто Serial.write(Serial1.read()); то в мониторе такое 

baudrate вычислял также по даташиту. Также пробовал соединять выход Serial2 cо входом Serial1, в итоге, как видно по коду буква t нормально отправляется и получается, т.е. Ардуино работает правильно. 

Идеи совсем кончились, прошу помощи у специалистов. Возможно уже такое обсуждали, поиском пользовался, но подходящего не увидел, если было ткните. Заранее благодарен.

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

Sevas55 пишет:

Если не использовать Serial1.available(), а просто Serial.write(Serial1.read()); то в мониторе такое 

Так вы читаете пустой буфер (0хFF, 255, 0х11111111). Значит на дуину ничего не приходит.

Sevas55
Offline
Зарегистрирован: 10.02.2013

Да, как вывод это мне уже понятно, получается что проблема на отдающей стороне. Но все функции я делал по примерам и даташиту для моей меги, в этом и проблема. Прошивка заливается точно, программатор рабочий - другие проекты работают.

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

Попробуйте сделать один стоповый бит, а не два:

void USART_Init(unsigned int baud)
{   
    UBRRH = (unsigned char) (baud >> 8);
    UBRRL = (unsigned char) baud;
    UCSRB = (1 << RXEN) | (1 << TXEN);
    UCSRC = (3 << UCSZ0);
}

 

Sevas55
Offline
Зарегистрирован: 10.02.2013

Вроде разобрался

В хелпе нашёл немного другую настройку USARTa

    UCSRA = 0x00;
    UCSRB = 0x18;
    UCSRC = 0x86;
    UBRRH = (xtal/16/baud-1) >> 8;
    UBRRL = (xtal/16/baud-1) & 0xFF;

А для отправки в CVAvr лучше использовать puts(""); и putchar();