Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Cи масив + rs232 стринг
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=7548
Страница 1 от 2

Автор:  darkshy [ Пет Фев 12, 2010 4:03 pm ]
Заглавие:  Cи масив + rs232 стринг

Я дайте някаква идея, че не мога да се сетя как да го направя. Въпросното нещо е:
1во - Пращам от серииния порт към МЦУ-то стринг "test1|test2|test3"
2ро - Как да получа и разбия този стринг на "test1", "test2" и "test3" като "|" е разделитела и да ги вкарам в масив?
Пиша за ПИК18ки на CSS или MCC18
:)

Автор:  valioman [ Пет Фев 12, 2010 4:38 pm ]
Заглавие:  Re: Cи масив + rs232 стринг

цикъл for до дължината на стринга и като видиш | сменяш индекса на масива който предварително си дефинирал разбира се

Автор:  darkshy [ Пет Фев 12, 2010 5:26 pm ]
Заглавие: 

Благодаря valioman! Непременно ще пробвам! :)

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

Автор:  sv_shady [ Пет Фев 12, 2010 5:53 pm ]
Заглавие: 

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

Автор:  miro_atc [ Пет Фев 12, 2010 6:26 pm ]
Заглавие: 

това със sscanf() e кофти идея... Дори при стандартните библиотеки има проблеми, пък за ПИк просто не ми се мисли ;-)

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

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

Автор:  sv_shady [ Пет Фев 12, 2010 6:48 pm ]
Заглавие: 

Дам вярно, че трябваше да е до ^|, малко ми е ръждясало С-то май :P Иначе мога да кажа, че CCS си има sscanf и sprintf и си работят идеално. Иначе при ANSI С и sscanf не съм имал никога проблеми, може ли да дадеш пример някой за проблем ?

Автор:  relsys [ Пет Фев 12, 2010 6:49 pm ]
Заглавие: 

Не, неможе със sscanf();, защото това е библиотека писана от някой си, и той не може да и се довери!

Автор:  miro_atc [ Пет Фев 12, 2010 7:48 pm ]
Заглавие: 

sv_shady написа:
Иначе при ANSI С и sscanf не съм имал никога проблеми, може ли да дадеш пример някой за проблем ?


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

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

Автор:  syscop [ Пет Фев 12, 2010 8:04 pm ]
Заглавие: 

strtok ?

Автор:  Цецо [ Пет Фев 12, 2010 9:45 pm ]
Заглавие: 

miro е прав.

Автор:  darkshy [ Пет Фев 12, 2010 11:11 pm ]
Заглавие: 

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

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

Автор:  goose [ Съб Фев 13, 2010 10:23 am ]
Заглавие: 

Код:
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);

Автор:  darkshy [ Съб Фев 13, 2010 1:07 pm ]
Заглавие: 

goose това го видях, но защо слагаш указатели след char :?:
Те не се ли използват за да указват адрес в рам-а?

Автор:  sv_shady [ Съб Фев 13, 2010 1:35 pm ]
Заглавие: 

Ами защото стринговете в С са просто масив от символи. Така кода горе заделя масив от указатели, и всеки от тези указатели ще сочи към стринг (масив от символи).

Автор:  syscop [ Съб Фев 13, 2010 1:40 pm ]
Заглавие: 

Преди да направиш copy/paste на примерчето помисли какво се случва ако имаш повече от 5 думи в buffer :?:

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/