Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
02.01.2009, 01:50
|
|
Частый гость
Регистрация: 11.11.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Помогите принять строку по usart от АТ модема
Ребята я у вас тут в первые помогите не могу написать кусок кода в CVAVR для приема по usart строку от мобильного телефона и сравнить ее со строкой во флеше контролера, ну например если телефон пошлет RING (звонок) МК выполняет какоето действие . Буду благодарен за любую информацию. :P
|
|
|
|
02.01.2009, 02:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Спросите у гугля, например, по запросу: receive string from UART AVR code...
Или сюда http://avr123.nm.ru/
Задача-то, в принципе, тривиально-рутинная...
Удачи в новом году!
__________________
Я, думаю, нужно подумать...
|
|
|
|
02.01.2009, 16:59
|
|
Частый гость
Регистрация: 11.11.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Да я понимаю что задача проста , япробовал и из буфера читать и функцыей scanf, но нечего не получается.
|
|
|
|
02.01.2009, 19:29
|
|
Временная регистрация
Регистрация: 17.12.2008
Адрес: Спб
Сообщений: 96
Сказал спасибо: 19
Сказали Спасибо 25 раз(а) в 20 сообщении(ях)
|
а под какой контроллер пишешь? регистр состояния смотришь? рекомендую в бесконечном цикле крутиться до взведения битика прихода, после этого вылетать (из бесконечного цикла)для приема байта.
|
|
|
|
02.01.2009, 19:33
|
|
Частый гость
Регистрация: 11.11.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Пишу под ATmega16 принять символ не вопрос а сострочкой не получается помогите плиз и пожалуйста код если можно на CVAVR
|
|
|
|
03.01.2009, 00:46
|
|
Прохожий
Регистрация: 07.01.2004
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
запусти wizard сделай txinterrupt сделай буфер например на 20 символов
в проге
запусти простой счетчик типа counter++
как только получишь первый символ сбрось счетчик в ноль
RX interrupt ()
{
data=UDR;
buffer[i++]=data;
counter=0;
}
и так далее пока символы идут
в main
смотри если таймер утикал дальше паузы значит пришол полный ответ
if (counter › XX) {то пришол ответ, забирай буфер и делай с ним что хочешь}
в приложении кусок кода от самого первого своего проекта, выжимки помогут
Прикрепленный файл: 311448.zip
|
|
|
|
03.01.2009, 14:49
|
|
Частый гость
Регистрация: 11.11.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Уважаемые вы мне уже сильно помогли но у меня есть еше вопрос по этому куску кода
if (getTimer(TGSM_MODULE_TIMEOUT)›= (unsigned int)(0.1 * sec))
{
resetTimer(TGSM_MODULE_TIMEOUT);
state=wait;
// пока не убираем
Query_length= rx_counter;
// копируем буфер USART с принятой посылкой (количество символов для копирования в счетчике байта усарта)
memcpy(Query, rx_buffer, Query_length);
// чистим счетчик принятых байт
rx_counter= 0;
/*
// здесь разбираем полученное сообщение
switch (at_command_in_tx_bufer)
{
case ATA
case
}*/
//reset_tx_bufer(); // чистим буфер от команды
}
А вопрос такой почему строчки по разборке полученого сообщения закоментированы, я так понимаю сюда я вписываю команду которая должна былы придти и пишу код обработчик этой каманды например
case RING:
{
printf("ATH
")
}
Так или поправте меня пожалуйста.
|
|
|
|
03.01.2009, 15:41
|
|
Прохожий
Регистрация: 07.01.2004
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
/*
// здесь разбираем полученное сообщение
switch (at_command_in_tx_bufer)
{
case ATA
case
}*/
потому что это вообще не было сделано
чтобы сделать case ATA, надо чтобы в at_command_in_tx_bufer уже лежала выжимка из посылки в виде текста, пусть тоже ATA
поскольку вопрос изначально стоял о том как обеспечить прием строки, то это и было изложено
а разбор может быть всяко разный
кто то тупо по буквам перебирает строки
кто то ведет анализ по количеству принятых символов (2 значит OK, 4 значит RING)
я решил делать по другому и вроде как получилось
я делал шлюз
писал писал код, он все рос и рос и стал уже почти неуправляем, хотя автоматный подход кучка функций все это было, но меня задавило
тогда ради решения задачи взял впервые опреционку и о чудо, все стало просто и красиво
поэтому рекоменжую после того как сможешь уверенно получать строки с uart заводи операционку
все делай задачами, одн азадача только ждет сообщения и получив выкидывает в другую ответы
потому что код без операционки типа ждать ОК в течении 2 секунд, на 2 секунды повесит твою систему, с ОС пока одна задача тупо ждет ОК 2 секунды, з аэти 2 секунды будет делать что-то, моргать светодиодами, гудеть тоном и прочее
|
|
|
|
03.01.2009, 15:48
|
|
Прохожий
Регистрация: 07.01.2004
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
мда, а разбор я сделал через вычисление хэша ответа и сравнения его с уже заранее вычисленными, в сухом остатке ответ определяется всего по двум байтам
// хэши известных ответов - вычесленные с 3 символа и по
или :
#define UNDEFINED 0xFFFF // неизвестный ответ " все что угодно "
#define NO_RESPONZE 0x0000 // нет ответа
#define OK 0x75B7 // команда отработана успешно "
OK
"
#define ERROR 0xED6B // команда не отработана "
ERROR
"
проверка в коде
Код:
|
Wait_RESPONZE(OK,1000) // ждем ответ OK не более 1000 мс
// если ответ OK то GSM_ERROR= 0;
// если TIMEOUT то GSM_ERROR= 99;
// если ответ не OK то GSM_ERROR=100; |
и сама инлайн вставка
Код:
|
#define Wait_RESPONZE(str,timeout)
{
OS_Wait_MsgT(&at_responze,&msg,timeout);
if ( OS_Timeout() )
{
GSM_ERROR=99;
}
else
{
p = (unsigned int *)msg;
if (*p == str )
{
GSM_ERROR=0;
}
else
{
GSM_ERROR=100;
}
}
RX_flush();
OS_Clear_Flag(&system_event, modem_busy);
} |
поэтому пока в строке OS_Wait_MsgT(&at_responze,&msg,timeout);
задача ждет сообщение at_responze система не висит а работает на других задачах
PS хеш вычисляется табличным способом по сообщению в буфере
|
|
|
|
03.01.2009, 16:01
|
|
Прохожий
Регистрация: 07.01.2004
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от sanitar249
|
Задача-то, в принципе, тривиально-рутинная...
|
я бы не сказал, что парсить строки, вести лексический разбор сообщений, которые вываливаются из модуля с временными сдвигами, иногда самостоятельно это тривиально рутиная задача
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Помогите со сбросом USART КР580ВВ51А
|
kramolnic |
Микроконтроллеры, АЦП, память и т.д |
19 |
11.04.2009 13:48 |
Взаимодействие USART МК PIC16F877 и модема
|
Ksenia_85 |
Микроконтроллеры, АЦП, память и т.д |
4 |
25.05.2008 11:20 |
В Delphi принять байт по COM
|
Muzicant |
Микроконтроллеры, АЦП, память и т.д |
16 |
24.04.2008 14:12 |
Помогите разобраться с USART в CodeVisionAVR
|
vendim |
Микроконтроллеры, АЦП, память и т.д |
20 |
26.07.2007 16:42 |
ПОЖАЛУСТА помогите на 8051 замутить бегущую строку!!!
|
иван |
Микроконтроллеры, АЦП, память и т.д |
0 |
28.04.2005 21:01 |
Часовой пояс GMT +4, время: 13:36.
|
|