0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24

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

01.04.2012, 15:31. Показов 6021. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.04.2012, 15:31
Ответы с готовыми решениями:

TServerSocket прием большого буфера от клиента. Как лучше реализовать?
Не знаю, как в названии темы описать свой вопрос. Клиент сделан на обычных сокетах (winsock2.h), тогда как сервер сделан в RAD Studio с...

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

Как лучше реализовать Push сервис для Windows приложения без IIS?
Нужно создать 2 приложения, первое сервер - консольное приложение. Должен принимать и удерживать соединения пока они сами не отключатся....

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

и что за хрено-код выдает этот мастер?
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
01.04.2012, 18:20
Цитата Сообщение от 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,514
01.04.2012, 19:29
Цитата Сообщение от dmhftm
когда я подконекчу ГПС к Атмеге будет переполнять буфер в режиме прерывания и в конечном итоге в буфере будет хаос. как лучше реализовать приём данных ? принимать в буфер по прерыванию думаю не стоит
с чего он будет переполнять буфер? сомневаюсь что принимаемая строка не влезет в 100 символов.
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
01.04.2012, 21:03
Цитата Сообщение от _pv
Цитата Сообщение от dmhftm
когда я подконекчу ГПС к Атмеге будет переполнять буфер в режиме прерывания и в конечном итоге в буфере будет хаос. как лучше реализовать приём данных ? принимать в буфер по прерыванию думаю не стоит
с чего он будет переполнять буфер? сомневаюсь что принимаемая строка не влезет в 100 символов.
я конечно не силён
модуль постоянно повторяет пакеты длинна одного комплекта ( 4 пакета ) = ~ 150 символов (примерно ) буфер можно сделать максимум 250 так то по идее может хватить
но модуль отправит за 5 секунд 500 символов
скрин работы модуля внизу (сейчас он шлет пакеты без широты и долготы тк я в помещении и модуль не видит спутников )

0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
01.04.2012, 23:32
Цитата Сообщение от 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
скрин с нажатым чекбоксом "Time" в настройках был бы куда более информативным
Извиняюсь все исправил лог с чекбоксом TIME

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

0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
02.04.2012, 02:32
Цитата Сообщение от dmhftm
это возможно все раскидывать на лету ???
как-то так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
примного благодарен
что это за строчка
char ParseGPS(char byte){ ?
у меня компилятор ругается на неё
где её декларировать куда её сувать ? непонятно
будет ли работать без неё ?
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 24
03.04.2012, 16:35
Цитата Сообщение от dmhftm
примного благодарен
что это за строчка
char ParseGPS(char byte){ ?
у меня компилятор ругается на неё
где её декларировать куда её сувать ? непонятно
будет ли работать без неё ?
Спасибо и на этом
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
03.04.2012, 19:49
Цитата Сообщение от dmhftm
что это за строчка
char ParseGPS(char byte){
объявление функции.
ругается потому что нельзя объявлять функции внутри других функций.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2012, 19:49
Помогаю со студенческими работами здесь

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

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

Создайте функцию, которая будет работать как оператор модуля % без использования оператора модуля
Создайте функцию, которая будет работать как оператор модуля % без использования оператора модуля

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

c# .NET 2.0 Как реализовать приём почты
Всем привет! Если не трудно приведите плиз простой пример email-клиента, который умеет принимать письма (как отсылать я знаю). Заранее...


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

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

Новые блоги и статьи
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru