Страница 1 из 3
Конвертация символов Ардуино.
Добавлено: Сб май 19, 2018 22:54:35
spikepavel
Добрый день/ночь форумчане.
Собственно такая проблема. У меня две платы ардуино соединены по 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); } // менять код.
}
Символы доходят и выводятся верно, но команды не выполняются.
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 01:00:17
Аlex
как нужно преобразовать входящую строку, чтобы при получении комбинации "CLS" была выполнена соответствующая команда
strcmp
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 01:52:45
spikepavel
Спасибо что ответили. Пытался запустить данную функцию (strcmp) в ардуину, но она не приняла ее. В визуал студио работает, а у ардуины свой компилятор, он тоже на С++, но не принимает...или я криво пишу.
Если я делаю:
if(Serial1.available()>0) {
int inByte = Serial1.read();
VGA.clear(inByte); }
То код работает и на любой входящий байт отличный от нуля он очищает экран под цвет входящего байта. Насколько я понял раз отсылается в виде ASCI символов, а это значения от 0 до 255, то можно как то обратно расконвертировать принятое значение и уже сравнить его, но как это сделать ума не хватает. 5 день пытаюсь решить данную проблему и нифига (((.
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 07:08:43
Dimon456
Функцией Serial.write() данные посылаются как байт, для отправки символа следует использовать функцию Serial.print().
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 08:24:13
spikepavel
Странно, попробую изменить, но у меня на всех принимающих устройствах при отправке им с функции Serial.write приходит то что печатаю на клаве. Буду отправлять и как символ и как байт).
А как тогда будет выглядеть кусок кода на принимающем, раньше он был в таком виде:
int inByte = Serial1.read();
VGA.write(inByte);
То есть я считывал побайтово каждый символ, сравнивал их с таблицей ASCI и выводил.
Напишите кто знает, если я отсылаю как Serial.print() , то как надо написать код на принимающем чтобы он увидел написанное там "CLS", а дальше выполнил соответствующую команду VGA.clear().
Я вижу что там что-то очень простое, но блин никак не пойму.
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 09:04:22
Dimon456
У вас кроме символов начинающих с 0х20 до 0х7F, есть еще от 0х00 до 0х1F, используйте их.
К примеру отправляете символ с кодом 0x03, а на приемной стороне после приема этого символа должна выполниться команда VGA.clear().
В противном случае надо на приемной стороне использовать буфер приема.
Добавлено after 20 minutes 47 seconds:
spikepavel писал(а):На одной плате стоит Бейсик, который шлет символы печатаемые мной второй ардуине,
а на чем вы печатаете эти символы? А вас клавиатура к Ардуино подключена?
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 10:41:52
Аlex
[uquote="spikepavel",url="/forum/viewtopic.php?p=3380990#p3380990"]Пытался запустить данную функцию (strcmp) в ардуину, но она не приняла ее. В визуал студио работает, а у ардуины свой компилятор, он тоже на С++, но не принимает...или я криво пишу[/uquote]Если бы Вы прошли не только по моей ссылке, а зашли бы ещё в пару статей, то ответ нашёлся бы сразу. Но, по всей видимости, Вам это было лень делать
Первая же ссылка -
http://www.c-cpp.ru/content/strcmp
Из описания :
Прототип:
string.h
А вообще, как уже выше подсказали, зачем Вам строки ? Сделайте набор команд, ограничивающихся одним байтом, и посылайте их. А следом за командой, если необходимо, посылайте аргументы.
Всё будет просто, чисто и прозрачно...
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 12:12:20
spikepavel
У меня путаница именно вот с этой байдой, не могу команды передать. Я на визуал студио это делаю, делаю в 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-и сути в поисках, сейчас уже вырубаюсь...спать пойду. На свежую голову может лучше будет. Спасибо всем кто откликнулся!
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 12:35:33
Dimon456
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); }
Коды клавиатуры В данном случае если будет нажата клавиша ESC (код клавиши 27) будет выполнена команда VGA.clear(), если ESC не нравится, выберите из списка другую.
Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 12:41:13
BOB51
ГРУСТНО...
Вот так и получается - начинающий собирает суперустройство из типовых проектов не освоив АЗОВ...
https://www.arduino.cc/reference/en/
в частности
https://www.arduino.cc/reference/en/lan ... on/serial/
и
https://www.arduino.cc/reference/en/lan ... on/stream/
а затем начинаются ГРАБЛИ...при попытке самостоятельной доработки типовых проектных решений.

Re: Конвертация символов Ардуино.
Добавлено: Вс май 20, 2018 20:18:53
emax
все зависит от реализации оператора CLS в используемом интерпретаторе бейсика. Если проект открытый, то можно посмотреть.
Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 01:17:49
spikepavel
Спасибо за помощь. На то они и "типовые" проекты чтобы на них учиться. В СИ++ у меня базовые знания, основную часть свободного времени я провожу в BASIC`е, не в современном, а том далеком просто Бейсике. А так пишу на HTML.
В Бейсике мне нравится то, что я могу на практически любой "железке" запустить его. Потребление электричества при этом можно сказать нулевое. А весь необходимый мне функционал он предоставляет. Пишу на нем код HTML, когда в дали от цивилизации, а дома скидываю/доредактирую. Сейчас решил "апгрейднуть" устоявшуюся версию сборки железа, но грабли-грабли-грабли. Да, я согласен, это все от моих поверхностных знаний СИ, но когда бывает свободное время, подтягиваю свои знания.
Конкретно сейчас код основной сборки скинуть не получится, нужно дизасемблировать его, а дома буду не скоро.
Именно сам CLS в основном бейсике не поддерживается, он выполняется только по команде, в данном случае очищает буфер памяти, заполняя все ее ячейки любым из диапазона 24 битного цвета.
Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 08:55:46
BOB51
Имелся ввиду Basic для ПК (а не для программирования МК)?
basicd for MC1502, gwbasic, qbasic1 - qbasic4,5 от микрософта или tbasic от borland?

(это из имеющихся в наличчии в моих запасах).

Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 09:42:15
spikepavel
Использую Дармунд Бейсик или Тини Бейсик, просто код через 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", пишет что не допустимо. Пробовал через перечисление байтов в одном условии, тоже не вышло.
Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 11:31:40
Аlex
spikepavel писал(а):...а как сделать чтобы сравнило не с 1 входящим байтом, а с комбинацией(строкой) из нескольких.
Повторяемся
strcmp
Чем он Вам не подошёл ?
Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 11:40:34
Мурик
BOB51 писал(а):Имелся ввиду Basic для ПК (а не для программирования МК)?basicd for MC1502, gwbasic, qbasic1 - qbasic4,5 от микрософта или tbasic от borland?
Какие-то древние бейсики у вас.
Современные это
VisualBasic,
VisualBasic.NET,
PureBasic,
PowerBasic,
FreeBasic и другие.
Для микроконтроллеров тоже есть бейсики.
Bascom (
для Arduino подходит),
MicroBasic и другие.
Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 13:01:08
spikepavel
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(); }
Но не работает. В общем костыль не удался... а как вообще нужно сделать чтобы по человечачьи было? Помогите кто знает.
Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 13:14:20
Ivanoff-iv
варианты:
1) начинать все команды со служебного символа (неиспользуемого в тексте) - тогда вероятность случайно получить требуемую комбинацию снизится.
2) выводить текст командой - т.е. в экранную плату пойдёт "PRINTхелло ворлд!!!(символ переноса строки)" или "PRINT14.хелло ворлд!!!" (14 - количество знаков в сообщении) и плата поймёт.
второй вариант мне больше нравится
ПС. это наброски, финальная реализация может оказаться немного другой.
Добавлено after 2 minutes 16 seconds:
3)[uquote="Аlex",url="/forum/viewtopic.php?p=3381939#p3381939"]Повторяемся
strcmp
Чем он Вам не подошёл ?[/uquote]
Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 13:24:54
Morroc
[uquote="spikepavel",url="/forum/viewtopic.php?p=3381968#p3381968"]Alex, конструкция подобного вида не компилится у меня, я синтаксис не пойму:
if(strcmp(inByte, "CLS"){
VGA.clear(); }[/uquote]
Вы бы хоть ошибку поскринили. Конкретно тут не хватает одной закрывающей скобки.
[uquote="spikepavel",url="/forum/viewtopic.php?p=3381968#p3381968"]Такие трудности у меня по причине того что устройство разнесено на 3 платы. Если собрать весь код на 1 плате то все заводится сразу, но скорость работы будет в виде, нажал кнопку, через 5 секунд отозвалась. Да и оперативки тогда не хватит на все разом, придется на флешку выгружать часть инфы, и она сдохнет быстро.
Но не работает. В общем костыль не удался... а как вообще нужно сделать чтобы по человечачьи было? Помогите кто знает.[/uquote]
Сначала желательно решить как именно по человечьи, остановиться на чем то одном.
Если вам проще на одной плате - собирали бы на одной, сейчас разновидностей "ардуин" много, есть и шустрые и с памятью.
Re: Конвертация символов Ардуино.
Добавлено: Пн май 21, 2018 14:23:24
BOB51
Задача с распараллеливанием задач на несколько "голов" (или СБИС) в одном устройстве не так уж проста - для ардуин подобного решения вроде не наблюдалось.
А порстое объединение нескольких самостоятельно работающих дуриний в один комплекс - задача также не из простых...
