Написание кода на Си для GPS-трекера

Здесь все вопросы по языку программирования С
fire89
Сообщения: 48
Зарегистрирован: 20 окт 2013, 20:44

Re: Написание кода на Си для GPS-трекера

Сообщение fire89 » 07 июл 2014, 23:03

Спасибо за новую статью, узнал много нового. Движемся дальше.

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Написание кода на Си для GPS-трекера

Сообщение gurvinok » 08 июл 2014, 06:03

Сейчас работа поднаперла, а так чуть позже напишу статейку по передаче на сервер.
Если долго мучиться, может быть получится.

fire89
Сообщения: 48
Зарегистрирован: 20 окт 2013, 20:44

Re: Написание кода на Си для GPS-трекера

Сообщение fire89 » 08 июл 2014, 21:27

Спасибо, было бы кстати.
Разобрал я Ваш код, немного переделал под свою мегу. Вроде как работает, но не до конца.
Резистивный делитель ставить не пришлось. У меня на выходе TX с меги уровень 5v, приходит AT команда с меги на RX SIM900 со скоростью 9600 бот. Получаю на мегу ответ ОК.
После этого все встает в ступор, следующая AT команда с меги не может отправиться, пока не выключу SIM900.
Может из-за того что у меня в меге висит ОК в буфере ? Прикрепил я тут исходник.
Вложения
proba_avr.rar
(21.41 КБ) 572 скачивания

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Написание кода на Си для GPS-трекера

Сообщение gurvinok » 08 июл 2014, 22:27

У меня на выходе TX с меги уровень 5v
Это плохо. Я же говорил что на RX SIM900d не должно приходить больше 3 вольт. Это важно.
По поводу кода.
1. Нафик переменная flag. Просто так висит, для балласта ))
2. Прерывание по таймеру можно выбросить если оно не используется.
3. А где проверяется ОК? :shock:
Судя по пограмме МК через каждую почти секунду пихает модулю сначала АТ, потом АТЕ0 и затем пытается позвонить. Потом опять пихает АТ, хотя при этом модуль пытается позвонить. Короче программа его просто вешает хаосом команд.
Команды АТ и АТЕ0 должны подаваться один раз в начале программы. То есть после них нужно создать бесконечный цикл while(1){} и в нем уже звонить. и самое главное что звонить один раз, а не через каждую секунду. Буфер если не очищать, то в нем будут постоянно записываться данные и когда ячейки закончатся, то он переполнится и будет писать на предыдущие данные. Если буфер не очищать, то обязательно из него вычитывать данные. Вот так

Код: Выделить всё

num=IndexNumber(); //Получаем количество ячеек данных в буфере. То что пришло в него.
OutBufferStr(temp,num); // Дергаем данные, при этом буфер сам обнуляется.
if(num) //Если num>0 то данные пришли.
{
	//Здесь уже разбираем строку которая лежит в масиве temp, а косичество ячеек равна num+1
}
Ну как-то так. Будут вопросы, разберемся.
Если долго мучиться, может быть получится.

fire89
Сообщения: 48
Зарегистрирован: 20 окт 2013, 20:44

Re: Написание кода на Си для GPS-трекера

Сообщение fire89 » 08 июл 2014, 23:17

Спасибо,я Вас понял. Буду разбираться.
А ответ "ОК" я получил на комп в консоль. Я подпаял USB Uart к TX Sim900D и увидел, как приходит ответ. Вот и подумал,что могу обойтись без резистивного делителя. :)

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Написание кода на Си для GPS-трекера

Сообщение gurvinok » 09 июл 2014, 17:11

То что идет от модуля плевать. Терминалу пофиг, важно что идет на модуль. Не более 3 вольт.
Если долго мучиться, может быть получится.

fire89
Сообщения: 48
Зарегистрирован: 20 окт 2013, 20:44

Re: Написание кода на Си для GPS-трекера

Сообщение fire89 » 02 авг 2014, 23:46

Никак не удается осуществить работу с кольцевым буфером :(
в консоль приходит мусор.

а вот с таким вариантом:
While(1)
{
UDR1=UDR0;
}
приходит то что надо.
Вложения
proba_avr.rar
пример работы с кольцевым буфером
(20.05 КБ) 552 скачивания

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Написание кода на Си для GPS-трекера

Сообщение gurvinok » 03 авг 2014, 11:29

Код: Выделить всё

UDR1=UDR0;
Это просто транзит из одного УДРа в другой без каких-либо проверок. А что собственно не работает в кольцевом буфере? Там же просто нужно функцией unsigned char IndexNumber(void) получить число и если оно больше нуля, то данные пришли и их можно вычитывать и обрабатывать. И я еще не понял зачем вот это:

Код: Выделить всё

indexStart &= indexStart++;
UDR1 = indexStart++;
Например если в indexStart будет 0, то в UDR1 уйдет 1 . Зачем :?:
Если долго мучиться, может быть получится.

fire89
Сообщения: 48
Зарегистрирован: 20 окт 2013, 20:44

Re: Написание кода на Си для GPS-трекера

Сообщение fire89 » 03 авг 2014, 14:18

Вот мне и не понятно, как правильно написать условие, чтоб вывести данные в UDR1.

в буфер я их поместил функцией unsigned char IndexNumber(void):

unsigned char IndexNumber(void)
{
if (indexEnd >= indexStart)
{
return (indexEnd - indexStart);
}
else
{
return ((BUFFER_SIZE - indexStart) + indexEnd);
}
}

Аватара пользователя
gurvinok
Сообщения: 1544
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Написание кода на Си для GPS-трекера

Сообщение gurvinok » 03 авг 2014, 16:42

Брррр.

Как только что-то прейдет в UDR0, сработает прерывание и в обработчике байт запишется в буфер.

Код: Выделить всё

ISR(USART0_RXC_vect)         // По приходу данных в UDR
{
	char temp = UDR0;
	if(!(temp == 0x0A || temp == 0x0D)) InBuffer(temp) ;
}
Далее функция unsigned char IndexNumber(void) возвращает количество байт полученных, в данной ситуации, из UDR0.

Далее мы забираем данные из буфера функцией:

Код: Выделить всё

void OutBufferStr(unsigned char*str, unsigned char lenght)
{
	char i;
	for(i=0; i<lenght; i++)
	{
		indexEnd++;
		indexEnd &= BUFFER_MASK;
		*str = buffer[indexEnd];
		str++;
	}
}
Все. Данные получены, делай с ними что хош. :)
Если долго мучиться, может быть получится.

Ответить