Конвертация символов Ардуино.

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="spikepavel",url="/forum/viewtopic.php?p=3381968#p3381968"]Вот тут я присваиваю все вхощие символы к "inByte"
Но не работает. В общем костыль не удался... а как вообще нужно сделать чтобы по человечачьи было?[/uquote]
1) не все а один
2) "по человечачьи" можно поискать:
http://qaru.site/questions/83751/conver ... ng-arduino
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Самый простой вариант
Спойлер

Код: Выделить всё

  char len;   //счетчик числа символов в команде

        ch1 = getchar(); // получаем символ из потока ввода
        
        if(ch1 == 'c' && len == 0){
         len++;
        }
        if(ch1 == 'l' && len == 1){
         len++;
        }      
        if(ch1 == 's' && len == 2){
         len++;
        } 
        if(ch1 == 0x0D && len == 3){  //  клавиша Enter
         len= 0;
         // выполнить очистку экрана ну или чего там надо
        }
        if(ch1 == 0x1B){  //  клавиша Esc сброс счетчиак числа символов в команде
         len= 0;
        }  
Т. е. перед отправкой команды нажать клавишу ESC.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а чего по неугадыванию знака лен не сбрасываете? у вас он сработает и в том случае, если между знаками команды будут и другие буквы... например: coleso "enter" выполнит очистку :)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Действительно.
Изменим
Спойлер

Код: Выделить всё

char len;   //счетчик числа символов в команде
char len_2; 

        ch1 = getchar(); // получаем символ из потока ввода
        len_2++;
        
        if(ch1 == 'c' && len == 0 && len_2 == 1){
         len++;
        }
        if(ch1 == 'l' && len == 1 && len_2 == 2){
         len++;
        }     
        if(ch1 == 's' && len == 2 && len_2 == 3){
         len++;
        } 
        if(ch1 == 0x0D && len == 3 && len_2 == 4){ //  клавиша Enter
         // выполнить очистку
         len=0;len_2=0;
        }
        if(ch1 == 0x1B){  // клавиша Esc сброс счетчиак числа символов в команде
         len= 0; len_2=0;
        }  
А теперь какова вероятность?
А по идее, без всякого дополнительного кода, после cls должен быть отправлен "enter", тогда Бейсик выполнит команду очистки, он либо "enter" не жмет, либо...
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="spikepavel",url="/forum/viewtopic.php?p=3381968#p3381968"]Alex, конструкция подобного вида не компилится у меня, я синтаксис не пойму:[/uquote]А я Вас не пойму.
Вы прямым текстом задаёте вопрос : "Как сравнить 2 строки ?". Вам дают ответ. И Вы, тут же, пишите вот такое :
[uquote="spikepavel",url="/forum/viewtopic.php?p=3381968#p3381968"]if(strcmp(inByte, "CLS"){[/uquote]
Где логика в Вами написанной строке кода, в которой присутствует байт (ну или символ, иными словами) , в то время, когда в Вашем вопросе о нём и речи не было ? :dont_know:

Вам нужно сначала принять строку (ссылку на простой вариант для абдурины дали чуть выше), а потом уже её сравнивать.
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Аlex писал(а):Где логика в Вами написанной строке кода
А он ее, логику, просто не видит.
spikepavel писал(а):А так пишу на HTML.
spikepavel вам задание, создайте алгоритм:
одно поле EditText, и два поля Label,
в первом Label должены отображаться вводимые в EditText символы,
а во втором Label отобразится только после комбинации символов CLS"enter".
То ест вам нужно просто напросто написать свой алгоритм поля password.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15604
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

ГЫММ...
протокол обмена по RS232 хорош при межкомпьютерной связи... асинхронный радиоканал... оптика/ультразвук...
А для внутрисхемных приложений (в пределах одной платы, между разными СБИС в пределах устройства)
предпочтительно как минимум или SPI или I2C - и быстрее и возможность приостановки обмена в критических интервалах.
:roll:
Последний раз редактировалось BOB51 Вт май 22, 2018 12:31:15, всего редактировалось 1 раз.
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт апр 08, 2016 10:09:03

Сообщение spikepavel »

Это по HTML:
var text = "ABSBDABSDBCLS DSADAD ASDA CLS";
var need = "CLS";

if(text.indexOf(need) != -1){
$("out_check").html("Найдено" + CLS);
}
Для .ХТМЛ нужен Джейквери еще.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

spikepavel писал(а):Это по HTML:
Нет, вы отслеживаете строку, а надо каждый символ.
К примеру где-то так
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт апр 08, 2016 10:09:03

Сообщение spikepavel »

В общем так у меня и не вышло довести до ума сравнение строк/символов между ардуинами).
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Значит 2 страницы обсуждения, с кучей советов от пользователей - напрасны. Печалька... :(
Мораль. Прежде, чем взяться за что-нибудь и пойти на форум с вопросами, стоит задаться вопросом - "А моё ли это ?". Дабы не тратить ни своего времени, ни чужого...
Контактная информация:
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт апр 08, 2016 10:09:03

Сообщение spikepavel »

Да не, не напрасно. Данные мне тут "знания" уже пригодились в другом деле.
А теперь снова по этой теме:
Данные идут с первой платы по Serial.write(c) :
size_t write(uint8_t);
size_t write(const char *str);
size_t write(const uint8_t *buffer, size_t size);

На второй плате они принимаются.
Если я вставляю в код вот такую конструкцию от dimon456:
char len; //счетчик числа символов в команде
char len_2;

ch1 = getchar(); // получаем символ из потока ввода
len_2++;

if(ch1 == 'c' && len == 0 && len_2 == 1){
len++;
}
if(ch1 == 'l' && len == 1 && len_2 == 2){
len++;
}
if(ch1 == 's' && len == 2 && len_2 == 3){
len++;
}
if(ch1 == 0x0D && len == 3 && len_2 == 4){ // клавиша Enter
VGA.clear();
len=0;len_2=0;
}
if(ch1 == 0x1B){ // клавиша Esc сброс счетчиак числа символов в команде
len= 0; len_2=0;
}

То 2 варианта развития....вариант 1 он делает очистку бесконечно со старта в loop'e.....вариант 2 он никак не реагирует на CLS и следом нажатый интер.

Вот сам основной код. Может я не туда его вставляю. inByte заменяю в коде на ch1 :
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();
VGA.moveCursor(0, 0);}
else VGA.write(inByte); }

}
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Заведите буфер и принимайте строку в него. По символу 0x0D (или '\n') заканчивайте приём строки и делайте сравнение.
Всё просто, как 5 копеек.
На другой вариант приёма сроки, который ещё проще (хотя куда уже ?!), давали ссылку чуть выше.

PS: Вы хоть читайте сообщения, что-ли. Да по ссылкам проходите, которые вам дают...
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

Если ему делать с буфером - то 1) этот буфер надо заполнять чтобы отделить "зерна от плевел" -> будут траблы при выводе текста
2) надо решить вопрос о длине буфера.
лучше пусть посимвольно сравнивает (как тут уже предлагали - со счётчиками) раз ему прямой вывод текста важен.
ПС: я бы делал конструкции со спецсимволом, с которого начинаются команды и не парился...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт мар 07, 2014 18:37:20
Откуда: Пермь

Сообщение emax »

подход какой-то не системный. Ну ладно CLS не работает, а другие операторы бейсика связанные с экраном работают? Например установить курсор в определенную позицию, нарисовать точку, линию, окружность?
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт апр 08, 2016 10:09:03

Сообщение spikepavel »

Их нет в самом бейсике. Сигналы должна ловить вторая плата, на которой уже крутится VGA библиотека. Если реализовывать графику+звук+операционку на одной плате, то все работает норм, но скорость работы ужасно медленная. А вот если разнести, то уже нет. Нажатия 1 клавиши или отправку одного символа я ловлю. А если символов больше одного или клавиш, то никак. Я никак не могу понять как ловить нужные мне куски текста(команд) на другой плате. Люди помогают, спасибо им, но что делать я так и не понял в итоге. Как бы я не сравнивал, то запуск нужной мне функции не выходит. Будем копать дальше).

Добавлено after 39 seconds:
Проблемы именно при попытке связать разные платы...
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3384271#p3384271"]ПС: я бы делал конструкции со спецсимволом, с которого начинаются команды и не парился...[/uquote] плата работает в обычном (твоем текстовом режиме) пока не поймает символ начала команды (этот символ не должен встречаться в обычном выводе текста), как поймала - вместо отправки на дисплей начинает складывать байты в буфер и складывает, пока или одна из команд не сойдётся или пока буфер не кончится (его длина должна быть равной длине самой длинной команды)... если буфер кончился, а команда ни одна не сошлась - вываливаем содержимое на дисплей как текст...
вариант, конечно, не совсем, но, пожалуй, самый простой
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт мар 07, 2014 18:37:20
Откуда: Пермь

Сообщение emax »

[uquote="spikepavel",url="/forum/viewtopic.php?p=3384388#p3384388"]Их нет в самом бейсике.[/uquote]

Проблема в этом. Если бейсик открытый и в нем есть возможность расширения, то Вам надо самому реализовать эти операторы , а какое у вас железо бейсику все равно, хоть графопостроитель. Какой протокол Вы выберете при обмене этих подпрограмм реализующих операторы зависит только от Вас. Можно использовать например команды ANSI терминала, можно что-нибудь свое.

Не пойму, почему Вы пытаетесь что-то поймать с ввода с клавиатуры. Представьте себе такую ситуацию, когда запущенная программа на бейсике крутится часами, что-то рисует на экране, очищает его, опять рисует. При этом никто ни какие кнопки на клавиатуре не нажимает и "CLS" не вводит.
Друг Кота
Аватара пользователя
Сообщения: 15604
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Вот и "всплыла" необходимость в определении ПРОТОКОЛА ОБМЕНА ДАННЫМИ между двумя устройствами.
8)
А что принять за таковой - взять какой-нибудь стандартный или придумать свой вариант - это и есть ТВОРЧЕСКАЯ ЗАДАЧА, решаемая САМИМ автором конструкции.
:write:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

spikepavel
Спойлер

Код: Выделить всё

char len; //счетчик числа символов в команде
char len_2;

void setup() {
Serial1.begin(9600);
VGA.begin(320, 240, VGA_COLOUR);
VGA.setInk(16);
}

void loop() {
if(Serial1.available()) {
int inByte = Serial1.read();

len_2++;

if((inByte == 'c'||inByte == 'C') && len == 0 && len_2 == 1){
len++;
}
if((inByte == 'l'||inByte == 'L') && len == 1 && len_2 == 2){
len++;
}
if((inByte == 's'||inByte == 'S') && len == 2 && len_2 == 3){
len++;
}
if(inByte == 13 && len == 3 && len_2 == 4){ // клавиша Enter
VGA.clear(); VGA.moveCursor(0,0);
len=0;len_2=0;
}
if(inByte == 13 || inByte==27){ // клавиша Enter или клавиша Esc сброс счетчика числа символов в команде
len= 0; len_2=0;
} 
if(inByte==27){ // клавиша ESC
VGA.clear();
VGA.moveCursor(0, 0);
} 

VGA.write(inByte); }
Добавлено after 4 minutes 34 seconds:
Да и мой HTML.
Ответить

Вернуться в «AVR»