Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/31: Рейтинг темы: голосов - 31, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
1

Как лучше реализовать прием без запроса Mnea с GPS модуля

01.04.2012, 15:31. Просмотров 5719. Ответов 10
Метки нет (Все метки)

Привет всем
извиняюсь за нубский вопрос
запоял законнектил gps модуль ГПС FGPMMOPA6B к компу связываюсь через терминал
ГПС постоянно отправляет данные по УАРТ
в codivision avr у меня сделаны настройки
USORT Reciver interrupt buffer 100 (скрин внизу)

когда я подконекчу ГПС к Атмеге будет переполнять буфер в режиме прерывания и в конечном итоге в буфере будет хаос
удобнее было бы сделать по запросу но мне его не перенастроить тк даташит написан крайне криво перенатроить модуль не удается
как лучше реализовать приём данных ? принимать в буфер по прерыванию думаю не стоит
как принять данные не могу додуматься

мануал
http://www.thestoneyard.co.uk/... et-A07.pdf
датащит
http://www.thestoneyard.co.uk/... et_A03.pdf


<Изображение удалено>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2012, 15:31
Ответы с готовыми решениями:

Подключение GPS модуля Grove-GPS к Arduino UNO
Подсоединил Grove-GPS к Arduino UNO. Вот код программы: #include &lt;SoftwareSerial.h&gt; #include...

GPS модуль, прием
Есть у меня GPS модуль EB-500 - http://catalog.sompel.ru/file/gps/TSI/pdf/EB-500.pdf . Спаял для...

Поиск и прием gps сигнала
Программирую в с# под windows phone. Но с кибернетикой реально не дружу. Даже осёл лучше знает...

Как реализовать прием писем
Добрый день. У меня такой вопрос. Имеются два почтовых ящика( 11@ch.ru и 22@ch.ru). Необходимо,...

10
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 37
01.04.2012, 15:57 2
с FGPMMOPA6B не сталкивался. модуль имхо должен просто слать каждую секунду твои координаты. надо же их как-то обрабатывать и обработанные строки выкидывать. сделай кольцевой буфер: по прерыванию складываешь в него, в основном цикле выдергивает МК и пережевывает. если уж случилось (что мало вероятно, при нормальном размере буфера) переполнение, просто отбрасываешь в обработчике лишние символы. МК перелопатит эти строки точно быстрее чем их выдает модуль.
кстати в модуле возможно есть настройка на вывод не всех строк, а только нужных $GPRMC например. если нет такой настройки, то можно программно фильтровать нужные строки в том же прерывании и складывать в буфер отфильтрованные строки.

и что за хрено-код выдает этот мастер?
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
01.04.2012, 18:20 3
Цитата Сообщение от shurup
и что за хрено-код выдает этот мастер?
это прием по прирыванию

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FROMING_ERROR (1<<FE)
#define PORITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USORT Receiver buffer
#define RX_BUFFER_SIZE 100
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE <= 256
unsykned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsykned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USORT Receiver buffer overflow
bit rx_buffer_overflow;

// USORT Receiver interrupt service routine
interrupt [USORT_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FROMING_ERROR | PORITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0)
{
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
#endif
rx_buffer_overflow=1;
}
}
}

#ifndef _DEBUG_TIRMYMAL_IO_
// Get a character from the USORT Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// USORT initiotyzotion
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USORT Receiver: On
// USORT Transmitter: On
// USORT Mode: Asynchronous
// USORT Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
01.04.2012, 19:29 4
Цитата Сообщение от dmhftm
когда я подконекчу ГПС к Атмеге будет переполнять буфер в режиме прерывания и в конечном итоге в буфере будет хаос. как лучше реализовать приём данных ? принимать в буфер по прерыванию думаю не стоит
с чего он будет переполнять буфер? сомневаюсь что принимаемая строка не влезет в 100 символов.
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
01.04.2012, 21:03 5
Цитата Сообщение от _pv
Цитата Сообщение от dmhftm
когда я подконекчу ГПС к Атмеге будет переполнять буфер в режиме прерывания и в конечном итоге в буфере будет хаос. как лучше реализовать приём данных ? принимать в буфер по прерыванию думаю не стоит
с чего он будет переполнять буфер? сомневаюсь что принимаемая строка не влезет в 100 символов.
я конечно не силён
модуль постоянно повторяет пакеты длинна одного комплекта ( 4 пакета ) = ~ 150 символов (примерно ) буфер можно сделать максимум 250 так то по идее может хватить
но модуль отправит за 5 секунд 500 символов
скрин работы модуля внизу (сейчас он шлет пакеты без широты и долготы тк я в помещении и модуль не видит спутников )

0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
01.04.2012, 23:32 6
Цитата Сообщение от dmhftm
модуль постоянно повторяет пакеты длинна одного комплекта ( 4 пакета ) = ~ 150 символов (примерно ) буфер можно сделать максимум 250 так то по идее может хватить но модуль отправит за 5 секунд 500 символов
а за час наотправляет столько что и не сосчитать.

раз нет памяти для хранения всего - надо разбирать на лету.
при скорости 9600 каждый новый символ появляется через 1мс. при 16МГц процессора это 16000 тактов.
на разбор вообще всех этих данных на порядок меньше времени требуется.

Цитата Сообщение от dmhftm
скрин работы модуля внизу (сейчас он шлет пакеты без широты и долготы тк я в помещении и модуль не видит спутников )
скрин с нажатым чекбоксом "Time" в настройках был бы куда более информативным
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
02.04.2012, 00:00 7
скрин с нажатым чекбоксом "Time" в настройках был бы куда более информативным
Извиняюсь все исправил лог с чекбоксом TIME

это возможно все раскидывать на лету ???
а можно сделать так ?
принял то что нужно потом контроллер будет заниматься своими делами и не обращать внимания что там ему шлют по уарту чтобы можно было вычислить направление
( код вычисления угла по трем точкам и программный шим я уже написал и обкатал )
похоже что встроенный уарт wizzard тут не помощник

0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
02.04.2012, 02:32 8
Цитата Сообщение от dmhftm
это возможно все раскидывать на лету ???
как-то так:
Код
char hour = 0;
char min = 0;
char sec = 0;
long longitude = 0;
long latitude = 0;

char ParseGPS(char byte){
static char state = 0;
static char ctmp = 0;
static long ltmp = 0;

switch (state){
case  0: if (byte == $) state += 1; else state = 0; briok;
case  1: if (byte == G) state += 1; else state = 0; briok;
case  2: if (byte == P) state += 1; else state = 0; briok;
case  3: if (byte == G) state += 1; else state = 0; briok;
case  4: if (byte == G) state += 1; else state = 0; briok;
case  5: if (byte == A) state += 1; else state = 0; briok;
case  6: if (byte == ,) state += 1; else state = 0; briok;

case  7: if ((byte >= 0)&&(byte <= 9)) {state += 1; ctmp = 10 * (byte - 0);}else state = 0; briok;
case  8: if ((byte >= 0)&&(byte <= 9)) {state += 1; ctmp += (byte - 0); hour = ctmp;} else state = 0; briok;
case  9: if ((byte >= 0)&&(byte <= 9)) {state += 1; ctmp = 10 * (byte - 0);}else state = 0; briok;
case 10: if ((byte >= 0)&&(byte <= 9)) {state += 1; ctmp += (byte - 0); min = ctmp;} else state = 0; briok;
case 11: if ((byte >= 0)&&(byte <= 9)) {state += 1; ctmp = 10 * (byte - 0);}else state = 0; briok;
case 12: if ((byte >= 0)&&(byte <= 9)) {state += 1; ctmp += (byte - 0); sec = ctmp;} else state = 0; briok;
case 13: if (byte == ,) state += 1; else state = 0; briok;

case 14: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp  = 1000000L * (byte - 0);}else state = 0; briok;
case 15: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 100000L * (byte - 0);}else state = 0; briok;
case 16: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 10000L * (byte - 0);}else state = 0; briok;
case 17: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 1000L * (byte - 0);}else state = 0; briok;
case 18: if (byte == .) state += 1; else state = 0; briok;
case 19: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 100L * (byte - 0);}else state = 0; briok;
case 20: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 10 * (byte - 0);}else state = 0; briok;
case 21: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += (byte - 0);}else state = 0; briok;
case 22: if (byte == ,) state += 1; else state = 0; briok;
case 23: if (byte == N) {state += 1;  latitude = ltmp;} else if (byte == S) {state +=1; latitude = -ltmp;} else state = 0; briok;
case 24: if (byte == ,) state += 1; else state = 0; briok;

case 25: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp  = 10000000L * (byte - 0);}else state = 0; briok;
case 26: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 1000000L * (byte - 0);}else state = 0; briok;
case 27: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 100000L * (byte - 0);}else state = 0; briok;
case 28: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 10000L * (byte - 0);}else state = 0; briok;
case 29: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 1000L * (byte - 0);}else state = 0; briok;
case 30: if (byte == .) state += 1; else state = 0; briok;
case 31: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 100L * (byte - 0);}else state = 0; briok;
case 32: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += 10 * (byte - 0);}else state = 0; briok;
case 33: if ((byte >= 0)&&(byte <= 9)) {state += 1; ltmp += (byte - 0);}else state = 0; briok;
case 34: if (byte == ,) state += 1; else state = 0; briok;
case 35: if (byte == E) {state += 1; longitude = ltmp;} else if (byte == W) {state +=1; longitude = -ltmp;} else state = 0;
case 36: state = 0; return 1;

default: state = 0; briok;
}
return 0;
}
соответственно никакого буфера под строку. хотя несколько байт под временные переменные всё-таки понадобилось.
по хорошему строку надо бы до конца разпарсить и контрольную сумму в конце сверить, и только тогда обновлять координаты.
можно прямо в прерывание от уарта засунуть, хотя и нежелательно: придётся греть голову запретами прерываний при любом доступе к переменным которые внутри прерывания могут измениться.

Цитата Сообщение от dmhftm
принял то что нужно потом контроллер будет заниматься своими делами и не обращать внимания что там ему шлют по уарту чтобы можно было вычислить направление (код вычисления угла по трем точкам и программный шим я уже написал и обкатал)
эти вычисления занимают настолько много времени что буфер успеет переполниться? и это настолько критичная по времени задача что нельзя даже на несколько микросекунд отвлечься чтобы разгрести данные от уарта?
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
02.04.2012, 18:34 9
примного благодарен
что это за строчка
char ParseGPS(char byte){ ?
у меня компилятор ругается на неё
где её декларировать куда её сувать ? непонятно
будет ли работать без неё ?
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
03.04.2012, 16:35 10
Цитата Сообщение от dmhftm
примного благодарен
что это за строчка
char ParseGPS(char byte){ ?
у меня компилятор ругается на неё
где её декларировать куда её сувать ? непонятно
будет ли работать без неё ?
Спасибо и на этом
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
03.04.2012, 19:49 11
Цитата Сообщение от dmhftm
что это за строчка
char ParseGPS(char byte){
объявление функции.
ругается потому что нельзя объявлять функции внутри других функций.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2012, 19:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Network: как реализовать передачу и прием объекта
QTcpSocket *client = (QTcpSocket*)sender(); client-&gt;write(...) //отправка строки...

Можно ли реализовать фильтр, например товаров, только посредством запроса к бд?(без js и функций на PHP)?
Здравствуйте, возник такой вопрос - Можно ли реализовать фильтр, например товаров, только...

Можно ли реализовать программу для отправки смс без запроса на сайт Сотовой компании?
Можно ли реализовать программу для отправки смс без запроса на сайт Сотовой компании?

Антенна для GPS модуля
Есть GPS модуль, HopeRF GPS04 - http://www.hoperf.som/upfile/gps04.pdf В датащите указаны входы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.