| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Проблем с четене на UART-a на PIC16F628A http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=3882 |
Страница 1 от 1 |
| Автор: | peterhr [ Чет Мар 15, 2007 10:33 am ] |
| Заглавие: | Проблем с четене на UART-a на PIC16F628A |
Здравейте, сглобих правилно хардуера за комуникация между PIC-а и GSM-a. Сега проблем се появи при комуникацията между тях или по-точно PIC-a изпраща команди към GSM-a. Самият GSM разбира правилно командите и ги изпълнява. Всичко което изпробвах работи. Проблема е в обратната посока, т.е. четенето на резултата от командите от самия PIC. Мисля че бъркам в програмата. Ако му дам: printf ("at\n\r"); gets(s2); в s2 се записва моята команда. Което донякъде мисля е вярно, защото телефона връща ехо на това което пиша. След това телефона трябва да върне: OK. Но това не се случва. Пробвах с още един gets(s2) на 3-тия ред, но "ОК" няма. Пробвах и това: printf ("atd029xxx\n\r"); add = 1; while (kbhit()) { c = getc (); write_eeprom (add, c); if (add < 50) add++; } но резултата е още по-зле. Прочита само "АТ" и след това спира да чете. Как трябва да се чете правилно постъпващата информация? За капак на всичко, като включа PICa към компютъра и си записва всичко точно и коректно каквото натисна на клавиатурата. |
|
| Автор: | plameniv [ Чет Мар 15, 2007 10:54 am ] | |||||||||
| Заглавие: | Re: Проблем с четене на UART-a на PIC16F628A | |||||||||
Всичко трябва да е като ASCI кодове към телефона , и той връща същото . А когато набираш даден телефонен номер на GSM-а му трябва следната комбинация !!! ATD+35929XXX; Зареди това и ще ти върне отговор OK Не е лошо да изпробваш всички команди предварително с терминал всеки windows има |
||||||||||
| Автор: | Predator_MF [ Чет Мар 15, 2007 10:55 am ] |
| Заглавие: | |
Бъркаш с писането в EEPROM-a, ако случайно не знаеш, един цикъл за запис е около 5ms, един байт на 9600 отнема 1ms...за първите 2ms PIC-a ти получава два байта във хардуерното FIFO, ти проверяваш с kbhit дали има нещо в него и по-надолу пишеш в EEPROM-а...в момента когато пишеш 3-тия байт във UART-a, PIC-a ти се занимава с писане в EEPROM а FIFO-то е пълно ...от там нататък става каша. Пробвай да пишеш резултата в RAM-а и след края на съобщението го драсни във EEPROM. |
|
| Автор: | ДедоБоре [ Чет Мар 15, 2007 11:00 am ] |
| Заглавие: | |
за кръгови буфери не си ли чувал? с в указателя - единия за пълнене на буфера, другия за празнене? трябва да се учи в началните курсове още. |
|
| Автор: | peterhr [ Чет Мар 15, 2007 11:12 am ] |
| Заглавие: | |
plameniv Първоначално пробвах всички команди като вързах телефона към компютъра. И без кода на България също набира, не е това проблема. Сега пробвам дори "АТ" само и трябва да даде "ОК", но няма. Predator_MF Не знаех че толкова е бавно писането в епрома. При мен и процесора работи на 4МХз, не на 20. Ще ги пиша в някой стринг и накрая ще го запиша в епрома за да мога да го прочета после от програматара. Мисля да вържа изхода на ГСМа към входа на МАХ232 да излиза това което той връща на компютъра. ДедоБоре Може и да сме го учили, не си спомням. ПП: Свързах изхода на ГСМ-а към входа на МАХ232. ГСМа си плюе всички необходими данни. Само дето програмно не мога да ги прочета |
|
| Автор: | peterhr [ Чет Мар 15, 2007 12:15 pm ] |
| Заглавие: | |
Правих още няколко опита. Независимо колко дълъг стринг изпратя към ГСМа, единствено него прочитам без грешка. Незнам обаче дали той реално е върнат от ГСМа като ехо. Отговора от ГСМ-а (ERROR или ОК) обаче немога да го прочета. На СОМ порта на компютъра пристига отговора, но ПИКа не може да го разбере. Пробвах по следния начин: printf ("ATtydgsdfsdfa\r\n"); gets (s1); gets (s2); delay_ms (250); for (add=1; add < 40; add++) write_eeprom (add, 0); for (add=1; add < 15; add++) write_eeprom (add, s1[add]); for (add=1; add < 15; add++) write_eeprom (add+20, s2[add]); Тук прочита целия стринг, но не прочита "ERROR". Пробвах и само "АТ", на компютъра връща "ОК", но ПИКа нищо не разбира. Как точно трябва да прочета данните от СОМ порта? Аз не държа толкова да са записани в еепрома, може да проверявам дали първия символ е "О" и да ми светва някой LED. |
|
| Автор: | ДедоБоре [ Чет Мар 15, 2007 12:35 pm ] |
| Заглавие: | |
http://www.vias.org/cppcourse/chap20_05.html http://www.massmind.org/techref/microchip/language/c/S628.htm и накрая http://forum.microchip.com/fb.aspx?m=228307 |
|
| Автор: | peterhr [ Чет Мар 15, 2007 12:45 pm ] |
| Заглавие: | |
OK, мерси. Сега ще ги разгледам. Иначе програмата ми тръгна. Оказа се че иска още един gets(); Незнам откъде идва, но като му сложих да прочита още един път и извади инфото връщано от ГСМа. Мерси за помощта. |
|
| Автор: | valioman [ Чет Мар 15, 2007 2:19 pm ] |
| Заглавие: | |
Не съм си играл с GSM ите ама не пускат ли символи за начало и край на пакета който връща. с тези gets() дето си почнал....... не знам какво ще стане с непознат отговор ако има такъв де . Поразгледай на някой терминал какво точно праща ГСМа като ASCII и виж дали няма еднакви символи в началото и в края на пакета. Ако има просто в пика слагаш един while(getc()!='символа'){.....} и си готов . Така поне ще прихващаш съобщения от всякакъв тип и дължина. ДА не говорим в ситуация с чексума на данните ако иам такива де .. Поздрави!!! |
|
| Автор: | peterhr [ Чет Мар 15, 2007 2:35 pm ] |
| Заглавие: | |
Няма чексума, няма и символи за начало и край. Първото което направих преди да започна беше на терминал да видя какво може да прави ГСМа. Подавах му команди и гледах отговорите. Извъртях вариантите, за които се сетих, че може да ми се случат и имам записана последователността на команди и отговори. |
|
| Автор: | setoy [ Чет Мар 15, 2007 3:03 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Ето оттука ти идва. Защото ГСМ-те (както и модемите) връщат "/r/n OK /r/n", а не просто ОК Разгледай функциите за работа със стрингове. Можеш да ползваш strcpy за да сравняваш стрингове, strstr за търсене на един стринг в друг и така нататък.... продължавайки в тоя дух 16-ката твърде скоро ще ти се види тясна, ама тва е друга тема Поне аз приемането винаги си го правя през прекъсване и със зададен таймаут, ама може би е просто въпрос на вкус |
|||||||||||||||||||
| Автор: | peterhr [ Чет Мар 15, 2007 3:09 pm ] |
| Заглавие: | |
Вярно е за таймаута, че иначе ще увисне програмата някъде. Може би наистина "\n\r" е разликата, но ще го направя да чете char и така няма да има проблеми. ПП: Телефона ми дава грешка когато му подам "\n\r", изпълнява командата, но дава грешка. Иска да е само Return - "\r". |
|
| Автор: | valioman [ Чет Мар 15, 2007 3:28 pm ] | |||||||||
| Заглавие: | ||||||||||
Точно "\n\r" е това за което говорих по горе ама кой да ме чуе и това не можеш да го видиш на терминал защото се прихваща и обработва от терминала. |
||||||||||
| Автор: | setoy [ Чет Мар 15, 2007 4:11 pm ] |
| Заглавие: | |
Да, телефона чака само /r, но би трябвало да връща /n/r. Що не ползваш терминала дето е вграден в CCS-a? Той ги показва тези символи |
|
| Автор: | peterhr [ Чет Мар 15, 2007 4:22 pm ] |
| Заглавие: | |
Не съм знаел че има терминал. 10х ПП: Пробвах два пъти да настроя параметрите на СОМ порта, обаче два пъти ми рестартира компютъра. Има ли някакъв тънък момент при нагласяването или моята версия нещо се гъбарка? Версията ми е 3.168. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|