Отговори на тема  [ 27 мнения ]  Отиди на страница 1, 2  Следваща
Cи масив + rs232 стринг 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение Cи масив + rs232 стринг
Я дайте някаква идея, че не мога да се сетя как да го направя. Въпросното нещо е:
1во - Пращам от серииния порт към МЦУ-то стринг "test1|test2|test3"
2ро - Как да получа и разбия този стринг на "test1", "test2" и "test3" като "|" е разделитела и да ги вкарам в масив?
Пиша за ПИК18ки на CSS или MCC18
:)


Пет Фев 12, 2010 4:03 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение Re: Cи масив + rs232 стринг
цикъл for до дължината на стринга и като видиш | сменяш индекса на масива който предварително си дефинирал разбира се


Пет Фев 12, 2010 4:38 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Благодаря valioman! Непременно ще пробвам! :)

П.П. Може да постнете и други предложения :)


Пет Фев 12, 2010 5:26 pm
Профил WWW
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 11, 2006 8:19 pm
Мнения: 373
Местоположение: София/Edinburgh, UK
Мнение 
Личи си, че го разбираш С-то и, че въобще имаш огормен опит с програмирането, че си писал много сериозни библиотеки и спокойно можеш да зклеймяваш разни езици както ти дойде и среди за програмиране. Само, че се размисли, ако наистина е така, щеше ли да питаш такива въпроси ??? Въпросът, който си задал е с възможно най-очевидното решение...което и valioman ти го казал. Може да го реализираш, обаче още по-чисто, ползвай sscanf(). Ако входа от RS232 си го запазил в str и искаш да го разделиш в маив test[3][10]:
Код:
sscanf(str, "%s|%s|%s", test[0], test[1], test[2]);

_________________
Българският портал за РОБОТИКА


Пет Фев 12, 2010 5:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
това със sscanf() e кофти идея... Дори при стандартните библиотеки има проблеми, пък за ПИк просто не ми се мисли ;-)

Стандартно %s сканира до white space и няма да спре на '|'
в случай че библиотеката е читава би трябвало да изглежда така:

Код:
if(sscanf(str, "%[^|]|%[^|]|%s", test[0]. test[1]. test[2]) == 3)
{
  //bingo!
}


Пет Фев 12, 2010 6:26 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 11, 2006 8:19 pm
Мнения: 373
Местоположение: София/Edinburgh, UK
Мнение 
Дам вярно, че трябваше да е до ^|, малко ми е ръждясало С-то май :P Иначе мога да кажа, че CCS си има sscanf и sprintf и си работят идеално. Иначе при ANSI С и sscanf не съм имал никога проблеми, може ли да дадеш пример някой за проблем ?

_________________
Българският портал за РОБОТИКА


Последна промяна sv_shady на Пет Фев 12, 2010 6:50 pm, променена общо 1 път



Пет Фев 12, 2010 6:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Не, неможе със sscanf();, защото това е библиотека писана от някой си, и той не може да и се довери!


Пет Фев 12, 2010 6:49 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
sv_shady написа:
Иначе при ANSI С и sscanf не съм имал никога проблеми, може ли да дадеш пример някой за проблем ?


Проблемите с лопата да ги ринеш ;-) Особено ако пишеш или портваш код с по-засукани форматни спецификатори... На практика няма две еднакви библиотеки, M$ базираните се държат по един начин, лайнукс базираните по друг, а стандартите казват трето ;-)
А при ембедед бозата е още по-голяма, защото или се ползва някаква неоптимизирана библиотека или е оптимизирана, но не е стандартна. Оптимазацията е особено нужна за контролери без хардуерно деление. При printf ако принтваш число в десетичен формат "%d" стандартните библиотеки ползват "/" и %, така за всяка отпечатана цифра се вика по два пъти div() за деление на 10. И това е една супер тромава функция. А деление на константа (10) може много да се оптимизира. Особено ако ядрото има MUL инструкция както са примерно АРМ7. Подобен род оптимизации могат да ускорят нещата над 100 (сто) пъти.

Не знам как е при ПИК, но честно казано и изобщо не ме интересува ;-)


Пет Фев 12, 2010 7:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение 
strtok ?


Пет Фев 12, 2010 8:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
miro е прав.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Фев 12, 2010 9:45 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Мисля, че на valioman решението е най-добре за мен :)
И аз мислех за нещо подобно но не знаех функцията как се казва. :?
Айде утре ще го напиша и ще постна резултати, защото сега протеуса ми е бъгнат и не тръгва и трябва да го преинсталвам апък и ми се ляга че днес съм си легнал сутринта в 4 а се събудих в 6 за даскало и "две" не виждам вече 8O (несъм вкъщи за да го пробвам с пик-а)

П.П. Видях функцията strtok. И тя би ми свършила работа. Но първо ще пробвам по начина на валиомен :)


Пет Фев 12, 2010 11:11 pm
Профил WWW
Ранг: Популярен
Ранг: Популярен

Регистриран на: Сря Окт 03, 2007 3:39 pm
Мнения: 311
Мнение 
Код:
char* ptrs[5]; //ili kolkoto ti triabva
char* search="|";
char* buffer="test1|test2|test3"; //tva ti e stringa, det triabva da splitnesh
int i=0;
ptrs[i]=strtok(buffer, search);
while (ptrs[i++] != NULL)
    ptrs[i]=strtok(NULL, search);

_________________
In God we trust. All others must submit an X.509 Certificate


Съб Фев 13, 2010 10:23 am
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
goose това го видях, но защо слагаш указатели след char :?:
Те не се ли използват за да указват адрес в рам-а?


Съб Фев 13, 2010 1:07 pm
Профил WWW
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 11, 2006 8:19 pm
Мнения: 373
Местоположение: София/Edinburgh, UK
Мнение 
Ами защото стринговете в С са просто масив от символи. Така кода горе заделя масив от указатели, и всеки от тези указатели ще сочи към стринг (масив от символи).

_________________
Българският портал за РОБОТИКА


Съб Фев 13, 2010 1:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение 
Преди да направиш copy/paste на примерчето помисли какво се случва ако имаш повече от 5 думи в buffer :?:


Съб Фев 13, 2010 1:40 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 27 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни