Всем привет. Решил сделать некую сигнализацию, которая будет отправлять смс по получению сигнала. И все, больше никаких функций. Дождался модуль из Китая, собрал плату, на макетке и даже нагулялся в терминале ком порта компьютера.
И, не поверите... Даже смс отправляю по получению сигнала. Но это все ерунда, по сравнению с опухшей головой от не понимания работы USART. Вернее, что то удалось понять, но проблема осталась.
А суть собственно в том, что я не могу получить ответа от модуля. Даже не представляю как это сделать. Я перепробовал кучу вариантов, находящихся в инете, но там в основном под ардуину.... Ай, ладно, разнылся.
Вот так я принимаю данные. (Александр Писанец)
И все, дальше мне надо узнать что я тут принял, К примеру, я должен получить ответ на какую то команду - ОК Как мне понять что ОК пришел??? Помогите пожалуйста. А то ведь так и лопнет башка, не поняв элементарного. Спасибо...
the_data_has у вас, судя по всему, хранит количество принятых команд. если эта переменная не равна 0, вам надо анализировать буфер bufGsm1, где будут все принятые строки, разделенные долларом.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
не так прежде всего то, что вы показываете кусочки кода, а проблема наверняка где-то еще. например, не ясно, даёте ли вы достаточно времени на приход ответа или нет, как именно вы опрашиваете - в цикле или нет и т.п.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Что отвечает модуль? "\r\nOK\r\n"? Тогда посмотрите свой код внимательно, "OK" будет не в начале буфера. Ну и кода установки индексов в начальное состояние Вы не приводите.
PS Контроль переполнения буфера отсутствует (надеюсь, там ничего не переполняется).
Код:
if (( Temp != 0x0d) & (Temp != 0x0a))
& и && разные операции, несмотря что, скорей всего в этом конкретном случае у Вас работает, я бы настоятельно рекомендовал не путать & и &&
Вы битики наобум ставите? RXCIE такого битика нет? Разрешение работы приемника и разрешение прерываний по приему символу - это разные биты. В даташит лень лезть.
воспользуйтесь стандартной функцией strstr или напишите свою
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
// прием данных ISR(USART_RXC_vect) { LED_yellov_on; register unsigned char Temp = UDR; // забираем принятый байт данных if (( Temp != 0x0d) && (Temp != 0x0a)) // пропускаем символы \r\n { bufGsm1[numberRX++] = Temp; // сохраняем принятые данные } if ( numberRX > addressTemp) // не проверяем первые два символа 0x0d,0x0a { if ( Temp == 0x0a) // принят 0x0A, зафиксирован конец пакета данных { bufGsm1[numberRX++] = '$'; // разделительный символ addressTemp = numberRX; the_data_has++; // принятое количество команд } } }
объясните мне, как в буфер попадают 0x0a и 0x0d, если согласно этому коду они туда не пишутся (6-я строка сверху)?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Я уже другой пробовал. Напрямую в буфер писал. Минуя данные операции. Таким способом отсеяв 0x0d 0x0a, вовсе не реагируя на них. Искал именно О и К отдельно. И через свич, короче, их нет в буфере. Но почему приходят 0x0d 0x0a?
И в терминале ОК есть.
Код:
ISR(USART_RXC_vect) { // unsigned int Temp = UDR; // забираем принятый байт данных //LED_yellov_on; switch(Temp) { case 0x4F: buffer[1] = 1;break; case 0x4B: buffer[2] = 1;break;
} }
void usart_detect_OK() { if (buffer[1] == 1 ) { if (buffer[2] == 1) { detect_ = 1; }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения