Форум РадиоКот https://radiokot.ru/forum/ |
|
Конвертация символов Ардуино. https://radiokot.ru/forum/viewtopic.php?f=57&t=155026 |
Страница 1 из 3 |
Автор: | spikepavel [ Сб май 19, 2018 22:54:35 ] |
Заголовок сообщения: | Конвертация символов Ардуино. |
Добрый день/ночь форумчане. ![]() Собственно такая проблема. У меня две платы ардуино соединены по RX/TX. На одной плате стоит Бейсик, который шлет символы печатаемые мной второй ардуине, которая у меня вместо видеокарты работает. Так вот мне нужно чтобы когда я переслал команду "CLS", плата "видеокарта" выполнила команду VGA.Clear() , но так как ардуина с Бейсиком шлет данные в виде ASCI символов как я понял, команда не выполняется. В общем сама суть...как нужно преобразовать входящую строку, чтобы при получении комбинации "CLS" была выполнена соответствующая команда. Вот кусок кода который отвечает за отправку у меня на сериал, тут все нормально: static void outchar(unsigned char c) { if( inhibitOutput ) return; #ifdef ARDUINO #ifdef ENABLE_FILEIO if( outStream == kStreamFile ) { // output to a file fp.write( c ); } else #endif #ifdef ARDUINO #ifdef ENABLE_EEPROM if( outStream == kStreamEEProm ) { EEPROM.write( eepos++, c ); } else #endif /* ENABLE_EEPROM */ #endif /* ARDUINO */ Serial.write(c); А вот код принимающего устройства: void setup() { Serial1.begin(9600); VGA.begin(320, 240, VGA_COLOUR); VGA.setInk(16); } void loop() { if(Serial1.available()) { int inByte = Serial1.read(); VGA.write(inByte); } if(Serial1.available()) { // клонировал сразу для удобства int inByte = Serial1.read(); // чтобы методом тыка VGA.write(inByte); } // менять код. } Символы доходят и выводятся верно, но команды не выполняются. |
Автор: | Аlex [ Вс май 20, 2018 01:00:17 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Цитата: как нужно преобразовать входящую строку, чтобы при получении комбинации "CLS" была выполнена соответствующая команда strcmp
|
Автор: | spikepavel [ Вс май 20, 2018 01:52:45 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Спасибо что ответили. Пытался запустить данную функцию (strcmp) в ардуину, но она не приняла ее. В визуал студио работает, а у ардуины свой компилятор, он тоже на С++, но не принимает...или я криво пишу. Если я делаю: if(Serial1.available()>0) { int inByte = Serial1.read(); VGA.clear(inByte); } То код работает и на любой входящий байт отличный от нуля он очищает экран под цвет входящего байта. Насколько я понял раз отсылается в виде ASCI символов, а это значения от 0 до 255, то можно как то обратно расконвертировать принятое значение и уже сравнить его, но как это сделать ума не хватает. 5 день пытаюсь решить данную проблему и нифига (((. |
Автор: | Dimon456 [ Вс май 20, 2018 07:08:43 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Функцией Serial.write() данные посылаются как байт, для отправки символа следует использовать функцию Serial.print(). |
Автор: | spikepavel [ Вс май 20, 2018 08:24:13 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Странно, попробую изменить, но у меня на всех принимающих устройствах при отправке им с функции Serial.write приходит то что печатаю на клаве. Буду отправлять и как символ и как байт). А как тогда будет выглядеть кусок кода на принимающем, раньше он был в таком виде: int inByte = Serial1.read(); VGA.write(inByte); То есть я считывал побайтово каждый символ, сравнивал их с таблицей ASCI и выводил. Напишите кто знает, если я отсылаю как Serial.print() , то как надо написать код на принимающем чтобы он увидел написанное там "CLS", а дальше выполнил соответствующую команду VGA.clear(). Я вижу что там что-то очень простое, но блин никак не пойму. |
Автор: | Dimon456 [ Вс май 20, 2018 09:04:22 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
У вас кроме символов начинающих с 0х20 до 0х7F, есть еще от 0х00 до 0х1F, используйте их. К примеру отправляете символ с кодом 0x03, а на приемной стороне после приема этого символа должна выполниться команда VGA.clear(). В противном случае надо на приемной стороне использовать буфер приема. Добавлено after 20 minutes 47 seconds: spikepavel писал(а): На одной плате стоит Бейсик, который шлет символы печатаемые мной второй ардуине, а на чем вы печатаете эти символы? А вас клавиатура к Ардуино подключена?
|
Автор: | Аlex [ Вс май 20, 2018 10:41:52 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Пытался запустить данную функцию (strcmp) в ардуину, но она не приняла ее. В визуал студио работает, а у ардуины свой компилятор, он тоже на С++, но не принимает...или я криво пишу Если бы Вы прошли не только по моей ссылке, а зашли бы ещё в пару статей, то ответ нашёлся бы сразу. Но, по всей видимости, Вам это было лень делать ![]() Первая же ссылка - http://www.c-cpp.ru/content/strcmp Из описания : Цитата: Прототип: string.h А вообще, как уже выше подсказали, зачем Вам строки ? Сделайте набор команд, ограничивающихся одним байтом, и посылайте их. А следом за командой, если необходимо, посылайте аргументы. Всё будет просто, чисто и прозрачно... |
Автор: | Dimon456 [ Вс май 20, 2018 12:35:33 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
spikepavel писал(а): А вот код принимающего устройства: Измените такСпойлерКод: void setup() { Serial1.begin(9600); VGA.begin(320, 240, VGA_COLOUR); VGA.setInk(16); } void loop() { if(Serial1.available()) { int inByte = Serial1.read(); if(inByte==27){ // клавиша ESC VGA.clear(); } else VGA.write(inByte); VGA.write(inByte); } |
Автор: | BOB51 [ Вс май 20, 2018 12:41:13 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
ГРУСТНО... ![]() Вот так и получается - начинающий собирает суперустройство из типовых проектов не освоив АЗОВ... https://www.arduino.cc/reference/en/ в частности https://www.arduino.cc/reference/en/lan ... on/serial/ и https://www.arduino.cc/reference/en/lan ... on/stream/ а затем начинаются ГРАБЛИ...при попытке самостоятельной доработки типовых проектных решений. ![]() |
Автор: | emax [ Вс май 20, 2018 20:18:53 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
все зависит от реализации оператора CLS в используемом интерпретаторе бейсика. Если проект открытый, то можно посмотреть. |
Автор: | spikepavel [ Пн май 21, 2018 01:17:49 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Спасибо за помощь. На то они и "типовые" проекты чтобы на них учиться. В СИ++ у меня базовые знания, основную часть свободного времени я провожу в BASIC`е, не в современном, а том далеком просто Бейсике. А так пишу на HTML. В Бейсике мне нравится то, что я могу на практически любой "железке" запустить его. Потребление электричества при этом можно сказать нулевое. А весь необходимый мне функционал он предоставляет. Пишу на нем код HTML, когда в дали от цивилизации, а дома скидываю/доредактирую. Сейчас решил "апгрейднуть" устоявшуюся версию сборки железа, но грабли-грабли-грабли. Да, я согласен, это все от моих поверхностных знаний СИ, но когда бывает свободное время, подтягиваю свои знания. Конкретно сейчас код основной сборки скинуть не получится, нужно дизасемблировать его, а дома буду не скоро. Именно сам CLS в основном бейсике не поддерживается, он выполняется только по команде, в данном случае очищает буфер памяти, заполняя все ее ячейки любым из диапазона 24 битного цвета. |
Автор: | BOB51 [ Пн май 21, 2018 08:55:46 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Имелся ввиду Basic для ПК (а не для программирования МК)? basicd for MC1502, gwbasic, qbasic1 - qbasic4,5 от микрософта или tbasic от borland? ![]() (это из имеющихся в наличчии в моих запасах). ![]() |
Автор: | spikepavel [ Пн май 21, 2018 09:42:15 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Использую Дармунд Бейсик или Тини Бейсик, просто код через REM или PRINT кидаю на SD карту или флешку. Новые реализации Бейсика мне не нравятся...они слишком сложные для меня. Я за простоту. Таким вот садо-мазохиским способом написано 65к+ строк кода уникального...какая разница на чем писать, главное чтобы работало... Вопрос по теме: Вот в таком виде код работает и очищает экран и возвращает курсор в начало экрана: } void loop() { if(Serial1.available()) { int inByte = Serial1.read(); if(inByte==27){ // клавиша ESC от "Dimon456" VGA.clear(); VGA.moveCursor(0, 0);} else VGA.write(inByte); } } ...а как сделать чтобы сравнило не с 1 входящим байтом, а с комбинацией(строкой) из нескольких. Я опробовал через "String", пишет что не допустимо. Пробовал через перечисление байтов в одном условии, тоже не вышло. |
Автор: | Аlex [ Пн май 21, 2018 11:31:40 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
spikepavel писал(а): ...а как сделать чтобы сравнило не с 1 входящим байтом, а с комбинацией(строкой) из нескольких. Повторяемся ![]() strcmp Чем он Вам не подошёл ? |
Автор: | Мурик [ Пн май 21, 2018 11:40:34 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
BOB51 писал(а): Имелся ввиду Basic для ПК (а не для программирования МК)?basicd for MC1502, gwbasic, qbasic1 - qbasic4,5 от микрософта или tbasic от borland? Какие-то древние бейсики у вас.Современные это VisualBasic, VisualBasic.NET, PureBasic, PowerBasic, FreeBasic и другие. Для микроконтроллеров тоже есть бейсики. Bascom (для Arduino подходит), MicroBasic и другие. |
Автор: | spikepavel [ Пн май 21, 2018 13:01:08 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Alex, конструкция подобного вида не компилится у меня, я синтаксис не пойму: if(strcmp(inByte, "CLS"){ VGA.clear(); } Если Вас не затруднит и Вы знаете как, то в качестве примера напишите мне как это приделать в вот это, чтобы проверить на "CLS": if(inByte==27){ // клавиша ESC от "Dimon456" VGA.clear(); VGA.moveCursor(0, 0);} else VGA.write(inByte); } Добавлено 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(); } Но не работает. В общем костыль не удался... а как вообще нужно сделать чтобы по человечачьи было? Помогите кто знает. |
Автор: | Ivanoff-iv [ Пн май 21, 2018 13:14:20 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
варианты: 1) начинать все команды со служебного символа (неиспользуемого в тексте) - тогда вероятность случайно получить требуемую комбинацию снизится. 2) выводить текст командой - т.е. в экранную плату пойдёт "PRINTхелло ворлд!!!(символ переноса строки)" или "PRINT14.хелло ворлд!!!" (14 - количество знаков в сообщении) и плата поймёт. второй вариант мне больше нравится ПС. это наброски, финальная реализация может оказаться немного другой. Добавлено after 2 minutes 16 seconds: 3) |
Автор: | Morroc [ Пн май 21, 2018 13:24:54 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Alex, конструкция подобного вида не компилится у меня, я синтаксис не пойму: if(strcmp(inByte, "CLS"){ VGA.clear(); } Вы бы хоть ошибку поскринили. Конкретно тут не хватает одной закрывающей скобки. Такие трудности у меня по причине того что устройство разнесено на 3 платы. Если собрать весь код на 1 плате то все заводится сразу, но скорость работы будет в виде, нажал кнопку, через 5 секунд отозвалась. Да и оперативки тогда не хватит на все разом, придется на флешку выгружать часть инфы, и она сдохнет быстро. Но не работает. В общем костыль не удался... а как вообще нужно сделать чтобы по человечачьи было? Помогите кто знает. Сначала желательно решить как именно по человечьи, остановиться на чем то одном. Если вам проще на одной плате - собирали бы на одной, сейчас разновидностей "ардуин" много, есть и шустрые и с памятью. |
Автор: | BOB51 [ Пн май 21, 2018 14:23:24 ] |
Заголовок сообщения: | Re: Конвертация символов Ардуино. |
Задача с распараллеливанием задач на несколько "голов" (или СБИС) в одном устройстве не так уж проста - для ардуин подобного решения вроде не наблюдалось. А порстое объединение нескольких самостоятельно работающих дуриний в один комплекс - задача также не из простых... ![]() |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |