Добрый день/ночь форумчане. Собственно такая проблема. У меня две платы ардуино соединены по 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 день пытаюсь решить данную проблему и нифига (((.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Странно, попробую изменить, но у меня на всех принимающих устройствах при отправке им с функции Serial.write приходит то что печатаю на клаве. Буду отправлять и как символ и как байт). А как тогда будет выглядеть кусок кода на принимающем, раньше он был в таком виде: int inByte = Serial1.read(); VGA.write(inByte); То есть я считывал побайтово каждый символ, сравнивал их с таблицей ASCI и выводил.
Напишите кто знает, если я отсылаю как Serial.print() , то как надо написать код на принимающем чтобы он увидел написанное там "CLS", а дальше выполнил соответствующую команду VGA.clear(). Я вижу что там что-то очень простое, но блин никак не пойму.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
У вас кроме символов начинающих с 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 битного цвета.
Использую Дармунд Бейсик или Тини Бейсик, просто код через 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 секунд отозвалась. Да и оперативки тогда не хватит на все разом, придется на флешку выгружать часть инфы, и она сдохнет быстро.
Но не работает. В общем костыль не удался... а как вообще нужно сделать чтобы по человечачьи было? Помогите кто знает.
Сначала желательно решить как именно по человечьи, остановиться на чем то одном.
Если вам проще на одной плате - собирали бы на одной, сейчас разновидностей "ардуин" много, есть и шустрые и с памятью.
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Задача с распараллеливанием задач на несколько "голов" (или СБИС) в одном устройстве не так уж проста - для ардуин подобного решения вроде не наблюдалось. А порстое объединение нескольких самостоятельно работающих дуриний в один комплекс - задача также не из простых...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения