Arduino Mega в качестве usb-serial конвертера
- Войдите на сайт для отправки комментариев
Пнд, 21/01/2013 - 01:12
Нужно было прошить роутер через консольный порт, набросал скетч для ардуины.
Если кому понадобится: pastebin.com
ТОЛЬКО ARDUINO MEGA!
Во-первых, ваш код нерабочий, потому что... где у вас в коде происходит проверка буфера и чтение данных из него? или другими словами - когда у вас в коде вызываются функции 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()); }ТОЛЬКО ARDUINO MEGA!
Не только, а еще и Leonardo и Micro, потому как они имеют помимо обычного UARTа еще и USB-UART.
Во-первых, ваш код нерабочий, потому что... где у вас в коде происходит проверка буфера и чтение данных из него? или другими словами - когда у вас в коде вызываются функции 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
А еще, многопоточность это офигенно и именно поэтому я использовал ивенты а не просто read-write
Да, извиняюсь, не знал о такой дуиновской функции.
Если для вас это "многопоточность", то огорчу вас - в способе "read-write" она тоже есть, (не в явном виде) потому как дуина и так работает с UARTом и копит данные в буфере по прерыванию, так что, перемещая эти данные из буфера в свою переменную и выводя эти данные по приходу символа '\n', вы просто все данные пропускаете через еще один буфер с задержкой, тем самым только замедлив и усложнив решение простой задачи и не более того.
Плюс к тому, если не встретится символ '\n', то что произойдет с вашей программой? Переменные inputString0 и inputString1 будут заполняться, и больше ничего и к чему это приведет?
Так что смысла и пользы в таких манипуляциях нет. Велосипед уже изобретен и третяя педаль только мешается.
Нужно было прошить роутер через консольный порт, набросал скетч для ардуины.
Если кому понадобится: pastebin.com
А можете описать сам процесс, перешивки роутера?
Роутер подключается к UART?
Чем льете прошивку?
Для меня актуально , так как делаю шилд на базе роутера wr703n для меги.
10 строчка кода вроде как лишнее, или встаки чтото там пропустили?
Да, вы тоже правы, но мне как-то с ивентами нагляднее было...
Нужно было прошить роутер через консольный порт, набросал скетч для ардуины.
Если кому понадобится: pastebin.com
А можете описать сам процесс, перешивки роутера?
Роутер подключается к UART?
Чем льете прошивку?
Для меня актуально , так как делаю шилд на базе роутера wr703n для меги.
10 строчка кода вроде как лишнее, или встаки чтото там пропустили?
Роутер(TL-WDR4300) шил по этой инструкции, я его брикнул нечаяно. Подключал по Serial. Прошивку лил бутлоадером. И да, 10-я строчка - это трап;)
Так что смысла и пользы в таких манипуляциях нет. Велосипед уже изобретен и третяя педаль только мешается.
Ага. Причем в File/Examples/SoftwareSerial/SoftwareSerialExample он даже уже есть на винте у любого ардуинщика. И будет работать на любой дуине не только Mega (это вообщем-то есть код который дал Максим в #2, только используется не аппаратный, а софтверный сериал).
Я не хочу сказать что ТС сделал что-то плохое. Молодец. С event-тами разобрался, со строками, немного, с людьми кодом поделился (только неясно почему через pastebin, а не через встроенную функцию вставки кода).
Просто если вдруг "кому потребуется" (или у него меги нет) - есть более простой путь. "Из коробки".
В чем проблема-то? Была задача, была ардуина, была ночь, было пиво, было время. Задача выполнена, все довольны. Выложил сюда, мало ли понадобиться кому-нибудь. Спасибо Максиму за более простой вариант, он тоже имеет место быть.
В чем проблема-то? Была задача, была ардуина, была ночь, было пиво, было время. Задача выполнена, все довольны. Выложил сюда, мало ли понадобиться кому-нибудь. Спасибо Максиму за более простой вариант, он тоже имеет место быть.
Да чего вы? Я же специально оговорил "Я не хочу сказать что ТС сделал что-то плохое". Все правильно вы сделали. Нет никакой проблемы. Все-бы так поступали - здорово-бы было. Есть проблема - пошел читать доки (а не ныть "дайте мне готовое"), нашел рабочие решение - поделился.
Дальше обсудили, нашли альтернативы. Что плохого? На то это и форум.
Для вас задача решена, но ветка может пригодится еще другим. Кто будет искать решение после вас. Увидят что не только мегу можно для этого использовать. Может кто-то узнает что ArduinoIDE идут стандартные примеры, тоже полезно знать.
Еще раз - никто не пытался бросить камень в ваш огород или высмеять. Все правильно, с вашей стороны, было сделано.
Вообщем похоже вы увидили "наезд" там где его небыло :) Не. Вам показалось. Мир-дружба-жвачка :)
Я очевидно вам ответил, наезд был со стороны Максима, про велосипед и т.п.
Я очевидно вам ответил, наезд был со стороны Максима, про велосипед и т.п.
И все равно "зря наезд увидели". "Написать велосипед" - это вообщем-то, в програмерском сленге - устоявшийся термин, а не "образ". Без негативной окраски. Означает "самостоятельную реализацию того для чего есть известное/популярное решение". "Изобретают велосипеды" - все и постоянно. Без этого - никак. По разным причинам "не знал" (не возможно все знать, следить за всеми популярными библиотеками"), хотел "сделать лучше", в "учебных целях", "было быстрее написать чем искать", "хотел большего контроля за кодом" и т.д. и т.п. Ни один практикующий программер - не обходится без "велосипедатворчества" :) Иногда случайно, иногда сознательно на это идет. Негативом это становится только когда приобретает "болезненые масштабы" (как и любое излишество) и пытаются "сам напишу", ну буквально все.
Так что максим просто назвал суть "софтового буффера над аппаратным". Но все равно - это полезно. Вот в соседних ветках уже отсылают смотреть на ваше решение. Как пример "чтение из сериал в буферную строку". Это может быть полезным и в других ситуациях, не только для вашей задачи. И там это будет "не велосипедом", а "полезным примером" ;)
Интересно было читать ваш пост, я, к слову сказать, прекрасно знаю что такое велосипед, в программистском сленге, я - сисадмин по образованию и по профессии. Мне все это знакомо... Просто ув. Максим высказался так, как-будто все что я делаю никому не сдалось, а вот то что он написал - это догма... Может я как-то криво его понял...
В общем-то улавливается "нотка наезда", но все-таки больше не наезд, а веский аргумент в ответ на сообщение #5.
В свою очередь, сообщение #5 было вполне весомым аргументом в ответ на, немного некомпетентное, сообщение #2. Я вполне доходчиво объяснил почему использовал именно эти средства. Давайте прикратим flood ибо ни к чему хорошему это не приведет... Я тоже многое узнал про софтварный буфер благодаря вашему сообщению, вы узнали про ивенты, все счастливы - все довольны...
Интересно было читать ваш пост, я, к слову сказать, прекрасно знаю что такое велосипед, в программистском сленге, я - сисадмин по образованию и по профессии. Мне все это знакомо...
Да. Че-то я не подумал и полез лекцию читать. Мог-бы и сам догадатся по фразе "с ивентами наглядней/привычней" :)
Просто ув. Максим высказался так, как-будто все что я делаю никому не сдалось, а вот то что он написал - это догма... Может я как-то криво его понял...
Ладно. Все живы, все счастливы :) Издержки невербального общения. При личном разговоре мы 80% передаем итонациями/жестами/позой. А тут все это теряется. И то что писалось как "просто фраза" или "легкая ирония", может оказатся прочитанной в совсем другом ключе. И никто не виноват. Ни тот кто читал, ни тот кто писал.
P.S. Хе... вот со стороны "менторить" - оно так просто. Видно кто что сказал, кто в чем ошибся. А ведь сам тоже, порой, тут, завожусь не на шутку от "неправильно проскользнувшей интонации" :) и включаю говномет на полную катушку :) Вы еще и "плавно" ответили на "наезд" ;)
Ну а что, как говорится, на дураков обижаться:)
Тема вроде подходящая.
Пытаюсь использовать Ардуино(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 нормально отправляется и получается, т.е. Ардуино работает правильно.
Идеи совсем кончились, прошу помощи у специалистов. Возможно уже такое обсуждали, поиском пользовался, но подходящего не увидел, если было ткните. Заранее благодарен.
Если не использовать Serial1.available(), а просто Serial.write(Serial1.read()); то в мониторе такое
Да, как вывод это мне уже понятно, получается что проблема на отдающей стороне. Но все функции я делал по примерам и даташиту для моей меги, в этом и проблема. Прошивка заливается точно, программатор рабочий - другие проекты работают.
Попробуйте сделать один стоповый бит, а не два:
void USART_Init(unsigned int baud) { UBRRH = (unsigned char) (baud >> 8); UBRRL = (unsigned char) baud; UCSRB = (1 << RXEN) | (1 << TXEN); UCSRC = (3 << UCSZ0); }Вроде разобрался
В хелпе нашёл немного другую настройку USARTa
UCSRA = 0x00; UCSRB = 0x18; UCSRC = 0x86; UBRRH = (xtal/16/baud-1) >> 8; UBRRL = (xtal/16/baud-1) & 0xFF;А для отправки в CVAvr лучше использовать puts(""); и putchar();