13.07.2017, 00:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
SIM800 + stm030 как правильно принимать по USART?
Здравствуйте! Взял GSM SIM800l. Разобрался в терминале как отправлять команды, посмотрел что приходит в ответ. написал программку которая отправляет команды с мк в модуль. Теперь надо написать чтобы мк видел ответы и выполнял соответствующие действия. Вопрос - как обычно люди прописывают это? Я думаю так:
- отправляем команду send_str("AT\r");
- знаем что в ответ должно прийти OK[]= "\x0D\x0A\x4F\x4B\x0D\x0A";//6
или ERROR(не буду его переводить)
- пишем условие что если пришло 6 значений в буффер или 9 то -› для 6 сравниваем массив OK[] с принятым, сравниваем ифами каждый элемент массива.
вот типа того что в коде...
PHP код:
|
uint8_t sim800_new_char(uint8_t c)
{
uint8_t t1;
sim800_recv_ok=0;
sim800_recv_err=0;
s_buf_recv[sim800_recieve_count]=c;
if(++sim800_recieve_count==S_BUFFER_SIZE) sim800_recieve_count=0;
if (s_buf_recv[sim800_recieve_count-1]==0x0a)
if (s_buf_recv[sim800_recieve_count-2]==0x0d)
{
if (s_buf_recv[sim800_recieve_count-3]=='K')
if (s_buf_recv[sim800_recieve_count-4]=='O') sim800_recv_ok++;
if (s_buf_recv[sim800_recieve_count-3]=='R')
if (s_buf_recv[sim800_recieve_count-4]=='O')
if (s_buf_recv[sim800_recieve_count-5]=='R')
if (s_buf_recv[sim800_recieve_count-6]=='R')
if (s_buf_recv[sim800_recieve_count-7]=='E') sim800_recv_err++;
}
}
|
выходит что нужно кучу ифов писать для всех вариантов ответов??? Или есть более разумный способ??
|
|
|
|
13.07.2017, 00:56
|
|
Заблокирован
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Есть парсинг и прием строк через дма.
Парсинг делается командами работы со строкам
|
|
|
|
13.07.2017, 01:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
индюк, про дма в курсе... а про парсинг не... Можете чуток поподромнее что такое парсинг?...
|
|
|
|
13.07.2017, 01:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,653
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Вот такой парсер я делал для STM32F103. А т.к. он совсем никак не завязан на железо, пойдет на любом другом МК. Ничего там сложного нет. Нужно лишь некоторые библиотечные функции реализовать, чтобы всякие жирные библиотеки не тянуть.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
13.07.2017, 02:20
|
|
Заблокирован
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
int parseCommand(char * str)
{
//
if( strstr(tstr,"COMMAND1") == str )
{
тут твои действия
}
}
соответственно на порт приходит эта самая "COMMAND1"
|
|
|
|
13.07.2017, 09:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
индюк,
Сообщение от индюк
|
if( strstr(tstr,"COMMAND1") == str )
|
strstr - это библиотечная функция?
eddy, я так понял что вот это мне надо?
PHP код:
|
int strncmp(const uint8_t *one, const uint8_t *two, int n){
int diff = 0;
do{
diff = (int)(*one++) - (int)(*two++);
}while(--n && diff == 0);
return diff;
}
|
|
|
|
|
13.07.2017, 10:36
|
|
Гражданин KAZUS.RU
Регистрация: 22.07.2007
Адрес: Владивосток
Сообщений: 984
Сказал спасибо: 435
Сказали Спасибо 375 раз(а) в 197 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
miwutka, почитай как реализовать в программе конечный автомат.
И реализуй. Вкратце - рисуется таблица состояний и таблица символов на входе. Автомат переходит из начального состояния в другие в зависимости от символов на входе в соответствии с таблицей. В переходах совершаются полезные действия.
|
|
|
|
13.07.2017, 11:20
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
На самом деле, нет ничего загадочного в этом парсинге.
В самом простейшем случае это будет сравнение первых N символов в строках с помощью встроенной функции strncmp. Для этого нужно подключить стандартную библиотеку #include ‹string.h›. Подробнее описание стандартных функций - https://ru.wikipedia.org/wiki/String.h.
Возвращаемое нулевое значение говорит о том, что мы нашли в буфере первые N символов искомого слова.
Правда, это работает только если искомое слово начинается с начала буфера.
PHP код:
|
#include ‹string.h› // стандартная библиотека для работы со строками
char buf[30] = "receive from modem"; // буфер, в который принята фраза "receive from modem"
char *word = "receive"; // строка с искомым словом "receive"
int result; // переменная результата сравнения
result = strncmp(buf, word, 7); // сравнение первых 7 символов в строках
if (result == 0) // если возвр.знач. = 0, значит
{
// в буфере есть искомое слово с начала буфера
}
|
Можно написать и собственную функцию сравнения строк, без стандартной библиотеки. Заодним, дополнить поиском в буфере начала искомой строки по совпадению первых символов.
Наиболее быстрым алгоритмом поиска слова в любом месте строки будет посимвольный поиск. То есть, нашли в буфере первый совпавший символ, затем если следующий символ в буфере равен следующему символу в искомой строке, то проверить и третий символ, а если нет, то продолжить искать первый символ искомой строки, со следующей позиции в буфере, которая была при сравнении с первым искомым символом.
То есть, ищется не целиком вся строка, а последовательно сравниваются следующие символы при совпадении предыдущих. Если нет совпадения следующего символа, поиск первого символа продолжается с той позиции, которая следующая после первого совпадения
Последний раз редактировалось NewWriter; 13.07.2017 в 11:28.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
13.07.2017, 11:31
|
|
Заблокирован
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от miwutka
|
strstr - это библиотечная функция?
|
все это уже встроено в любой редактор си и выше
https://ru.wikipedia.org/wiki/String.h
|
|
|
|
13.07.2017, 11:34
|
|
Заблокирован
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от NewWriter
|
Наиболее быстрым алгоритмом поиска слова в любом месте строки будет посимвольный поиск. То есть, нашли в буфере первый совпавший символ, затем если следующий символ в буфере равен следующему символу в искомой строке, то проверить и третий символ, а если нет, то
|
это все в string.h есть
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:00.
|
|