Добрый день/ночь форумчане. Собственно такая проблема. У меня две платы ардуино соединены по RX/TX. На одной плате стоит Бейсик, который шлет символы печатаемые мной второй ардуине, которая у меня вместо видеокарты работает. Так вот мне нужно чтобы когда я переслал команду "CLS", плата "видеокарта" выполнила команду VGA.Clear() , но так как ардуина с Бейсиком шлет данные в виде ASCI символов как я понял, команда не выполняется. В общем сама суть...как нужно преобразовать входящую строку, чтобы при получении комбинации "CLS" была выполнена соответствующая команда. Вот кусок кода который отвечает за отправку у меня на сериал, тут все нормально: static void outchar(unsigned char c) { if( inhibitOutput ) return;
Спасибо что ответили. Пытался запустить данную функцию (strcmp) в ардуину, но она не приняла ее. В визуал студио работает, а у ардуины свой компилятор, он тоже на С++, но не принимает...или я криво пишу.
Если я делаю:
if(Serial1.available()>0) { int inByte = Serial1.read(); VGA.clear(inByte); }
То код работает и на любой входящий байт отличный от нуля он очищает экран под цвет входящего байта. Насколько я понял раз отсылается в виде ASCI символов, а это значения от 0 до 255, то можно как то обратно расконвертировать принятое значение и уже сравнить его, но как это сделать ума не хватает. 5 день пытаюсь решить данную проблему и нифига (((.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Странно, попробую изменить, но у меня на всех принимающих устройствах при отправке им с функции Serial.write приходит то что печатаю на клаве. Буду отправлять и как символ и как байт). А как тогда будет выглядеть кусок кода на принимающем, раньше он был в таком виде: int inByte = Serial1.read(); VGA.write(inByte); То есть я считывал побайтово каждый символ, сравнивал их с таблицей ASCI и выводил.
Напишите кто знает, если я отсылаю как Serial.print() , то как надо написать код на принимающем чтобы он увидел написанное там "CLS", а дальше выполнил соответствующую команду VGA.clear(). Я вижу что там что-то очень простое, но блин никак не пойму.
У вас кроме символов начинающих с 0х20 до 0х7F, есть еще от 0х00 до 0х1F, используйте их. К примеру отправляете символ с кодом 0x03, а на приемной стороне после приема этого символа должна выполниться команда VGA.clear().
В противном случае надо на приемной стороне использовать буфер приема.
Добавлено after 20 minutes 47 seconds:
spikepavel писал(а):
На одной плате стоит Бейсик, который шлет символы печатаемые мной второй ардуине,
а на чем вы печатаете эти символы? А вас клавиатура к Ардуино подключена?
Пытался запустить данную функцию (strcmp) в ардуину, но она не приняла ее. В визуал студио работает, а у ардуины свой компилятор, он тоже на С++, но не принимает...или я криво пишу
Если бы Вы прошли не только по моей ссылке, а зашли бы ещё в пару статей, то ответ нашёлся бы сразу. Но, по всей видимости, Вам это было лень делать
А вообще, как уже выше подсказали, зачем Вам строки ? Сделайте набор команд, ограничивающихся одним байтом, и посылайте их. А следом за командой, если необходимо, посылайте аргументы. Всё будет просто, чисто и прозрачно...
У меня путаница именно вот с этой байдой, не могу команды передать. Я на визуал студио это делаю, делаю в HTML. В чем дело не пойму. Если я все это делаю на одной плате, то работает все....а именно при посылке с одной платы на другую нет.
По поводу: "а на чем вы печатаете эти символы? А вас клавиатура к Ардуино подключена?" У меня подключены три SD карты, PS/2 клава, 2 USB порта, вывод на VGA c разрешением до 1024х768 монохромный или вплоть до 480х320 цветной 24 бита ( максимальные показатели при частоте 108Мгц). Все разделено на 3 платы у меня, первая плата процессор, вторая видеокарта, третья выполняет роль звуковухи. В общем полноценный компьютер, даже в инет можно выйти (правда ответ получить чисто или отослать что в текстовом виде, без поддержки графики инет разумеется), я все это собрал из разных частей кода, у меня ардуины DUE, там 32 битные процы с поддержкой без всякой мороки по внешней шине до 16 мегайбат оперативки.
С "процессорной" платы я кидаю команды на видеокарту и звуковуху. На одной SD карте у меня дрова и проги для операционки(бейсик), на другой чисто изображения, на третьей звуки/музыка. Если надо серьезная музыка, не вав формата, то просто модуль МП-3 соединяешь, там тебе уже декодер МП-3 и не тратит ресурсов Дуины и управляется легко. Навыки Си++ базовые есть, но они мне не помогают именно в конкретном вопросе. Данные я отправляю по Serial.write(c); Как их принять чтобы по ним выполнилась команда, ну я реально не догоняю что и куда тыкнуть. Может кто то написать эти несколько строк или больше, чтобы меня носом тыкнуть. Ну реально не догоняю как реализовать, методом тыка перебрал сотни комбинаций. Если я пишу с первой платы в виде Serial.print(), то на вторую плату приходит в виде набора цифр, получается супер каша. Пробовал сравнивать как цифры, не выходит. По этому отправку делаю в виде Serial.write(), а дальше уже "побайтово вывожу" и все красиво. Но команду передать никак не могу, Дуина думает что это просто текст. Я перечитал и перелопатил все что можно, но увы никак не доходит...как оказалось собрать "почти" работающий компьютер вышло легче чем....
Ниже картинки кидаю не полной тестовой сборки:
Добавлено after 27 minutes 52 seconds: По этому: "А вообще, как уже выше подсказали, зачем Вам строки ? Сделайте набор команд, ограничивающихся одним байтом, и посылайте их. А следом за командой, если необходимо, посылайте аргументы. Всё будет просто, чисто и прозрачно..." Я уже не соображаю, 3-и сути в поисках, сейчас уже вырубаюсь...спать пойду. На свежую голову может лучше будет. Спасибо всем кто откликнулся!
Коды клавиатуры В данном случае если будет нажата клавиша ESC (код клавиши 27) будет выполнена команда VGA.clear(), если ESC не нравится, выберите из списка другую.
Спасибо за помощь. На то они и "типовые" проекты чтобы на них учиться. В СИ++ у меня базовые знания, основную часть свободного времени я провожу в BASIC`е, не в современном, а том далеком просто Бейсике. А так пишу на HTML. В Бейсике мне нравится то, что я могу на практически любой "железке" запустить его. Потребление электричества при этом можно сказать нулевое. А весь необходимый мне функционал он предоставляет. Пишу на нем код HTML, когда в дали от цивилизации, а дома скидываю/доредактирую. Сейчас решил "апгрейднуть" устоявшуюся версию сборки железа, но грабли-грабли-грабли. Да, я согласен, это все от моих поверхностных знаний СИ, но когда бывает свободное время, подтягиваю свои знания. Конкретно сейчас код основной сборки скинуть не получится, нужно дизасемблировать его, а дома буду не скоро. Именно сам CLS в основном бейсике не поддерживается, он выполняется только по команде, в данном случае очищает буфер памяти, заполняя все ее ячейки любым из диапазона 24 битного цвета.
Имелся ввиду Basic для ПК (а не для программирования МК)? basicd for MC1502, gwbasic, qbasic1 - qbasic4,5 от микрософта или tbasic от borland? (это из имеющихся в наличчии в моих запасах).
Последний раз редактировалось BOB51 Пн май 21, 2018 10:43:15, всего редактировалось 1 раз.
Использую Дармунд Бейсик или Тини Бейсик, просто код через REM или PRINT кидаю на SD карту или флешку. Новые реализации Бейсика мне не нравятся...они слишком сложные для меня. Я за простоту. Таким вот садо-мазохиским способом написано 65к+ строк кода уникального...какая разница на чем писать, главное чтобы работало... Вопрос по теме: Вот в таком виде код работает и очищает экран и возвращает курсор в начало экрана: }
void loop() { if(Serial1.available()) { int inByte = Serial1.read();
...а как сделать чтобы сравнило не с 1 входящим байтом, а с комбинацией(строкой) из нескольких. Я опробовал через "String", пишет что не допустимо. Пробовал через перечисление байтов в одном условии, тоже не вышло.
Добавлено after 26 minutes 7 seconds: Такие трудности у меня по причине того что устройство разнесено на 3 платы. Если собрать весь код на 1 плате то все заводится сразу, но скорость работы будет в виде, нажал кнопку, через 5 секунд отозвалась. Да и оперативки тогда не хватит на все разом, придется на флешку выгружать часть инфы, и она сдохнет быстро. Команды отправляю через "Serial.write(с)" с основной платы, остальные принимают и исполняют/печают. Вот если команда из 1 символа, то сразу все делается, а если их больше одного, то ноль реакции. Ну и при таком методе количество команд ограничено(клавиш лишних мало), и не дай Бог код клавиши в тексте попадется, произойдет очистка экрана). Вот тут я присваиваю все вхощие символы к "inByte": int inByte = Serial1.read(); VGA.write(inByte); }
Далее если есть CLS:
if(strcmp(inByte, "CLS"){ VGA.clear(); }
Но не работает. В общем костыль не удался... а как вообще нужно сделать чтобы по человечачьи было? Помогите кто знает.
варианты: 1) начинать все команды со служебного символа (неиспользуемого в тексте) - тогда вероятность случайно получить требуемую комбинацию снизится. 2) выводить текст командой - т.е. в экранную плату пойдёт "PRINTхелло ворлд!!!(символ переноса строки)" или "PRINT14.хелло ворлд!!!" (14 - количество знаков в сообщении) и плата поймёт. второй вариант мне больше нравится ПС. это наброски, финальная реализация может оказаться немного другой.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Такие трудности у меня по причине того что устройство разнесено на 3 платы. Если собрать весь код на 1 плате то все заводится сразу, но скорость работы будет в виде, нажал кнопку, через 5 секунд отозвалась. Да и оперативки тогда не хватит на все разом, придется на флешку выгружать часть инфы, и она сдохнет быстро.
Но не работает. В общем костыль не удался... а как вообще нужно сделать чтобы по человечачьи было? Помогите кто знает.
Сначала желательно решить как именно по человечьи, остановиться на чем то одном.
Если вам проще на одной плате - собирали бы на одной, сейчас разновидностей "ардуин" много, есть и шустрые и с памятью.
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Задача с распараллеливанием задач на несколько "голов" (или СБИС) в одном устройстве не так уж проста - для ардуин подобного решения вроде не наблюдалось. А порстое объединение нескольких самостоятельно работающих дуриний в один комплекс - задача также не из простых...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения