RTKlib/постпроцессинг

-1

-1

-1

С 2 точек, скорее всего, не получится :frowning:
Я зарегился на портале навгеокома Там есть станции в 3км и в 202км.
По ним векторы получаются посимпатичнее. Посчитал 5 дней, решения получились в радиусе 5см и высота - от 191.9м до 193.1м.
Вот один из отчетов. cheb и NNOV - станции Навгеокома.


Исходные точки
	                                                   95%
	Имя                                Компоненты    Ошибка                Статус    Погрешность   
       cheb             Долгота:  47° 15' xx.xxxxx"E     0.000                  ФИКС
                         Широта:  56° 06' xx.xxxxx"N     0.000                  ФИКС
                 Эллипсоидальная высота             xxx.xxx     0.000                  ФИКС


       NNOV             Долгота:  44° 01' xx.xxxxx"E     0.000                  ФИКС
                         Широта:  56° 19' xx.xxxxx"N     0.000                  ФИКС
                 Эллипсоидальная высота             xxx.xxx     0.000                  ФИКС

Измеренные точки
	                                                      95%
	Имя                                Компоненты       Ошибка             Статус    
       gag2             Долгота:  47° 16' 04.32601"E        0.002            Уравнен
                         Широта:  56° 07' 43.77197"N        0.002            Уравнен
                 Эллипсоидальная высота             191.949        0.013            Уравнен

Обработанные векторы
                             Вектор       95%         Вектор        95%
  ID вектора                  Длина     Ошибка      Компоненты    ОшибкаСпутник PDOPКачество привязки   Решение   
  cheb - gag2              3173.998      0.016   X   -20xx.xxx     0.006 11  1.6    Фиксирован.
  12/05/11 04:00:00.00                           Y   -17xx.xxx     0.006
          +23:59:55.00                           Z    17xx.xxx     0.007

  NNOV - cheb            202480.569      0.979   X -129xxx.xxx     0.397 10  1.4  NoФиксирован.
  12/05/11 04:00:00.00                           Y  155xxx.xxx     0.397
          +23:59:55.00                           Z  -13xxx.xxx     0.397

  NNOV - gag2            202383.070      0.979   X -131xxx.xxx     0.397  7  2.3  NoФиксирован.
  12/05/11 04:00:00.00                           Y  153xxx.xxx     0.397
          +23:59:55.00                           Z  -12xxx.xxx     0.397


Разделил sirf логи по дням и выложил на ftp.

Из вычислений Alexey Illarionova - относительная ошибка всех векторов 1/200 000.
Практика она лутше всего обосновывает. По ссылке показаны допустимые растояния от базовых станций http://igd.uran.ru/geomech/station/about.htm . Сбросил файл для
ALEXEY http://files.mail.ru/9W3HW9. Пять дней наблюдений это круто. А теперь посчитайте коодинаты своей
базовой станции за 1,2,3,4,5 день от cheb, определите средние. Это будут координаты вашей базовой
станции с точностью до 2см.
Вопрос всем: Зачем Вам нужна - базовая станция?
По поводу Павла Ладикова: он хотел создать базовые станции на основе OEM модулей MTK.

Это самообман. То что написано в колонке 95% - всего-лишь статистическая оценка самой программы обработки “странным” образом меняющаяся при изменении параметров обработки :). С реальной точностью она имеет мало общего (а бытовым одночастотником на 200 или 700 км - тем более). Надо сравнивать на известном пункте, снятом геодезическим двухчастотником. Тогда можно давать оценки.

Что Вы, что Вы! Это я поддержал отечественного производителя. Аккумулятор и прожорливость прибора даже в машине требуют работаюший двигатель.
Цена (я купил за 4700 р.) на мой взгляд уже близка к себестоимости. Стартовая цена была 15000 р.
А с исследованием его пока прервался. Осваиваю тему “кросс-компиляция для win-CE из Линукса”.
Пока не получу работающую и компилирующую сборку Линукса на HP hx4700 попробую еще раз программить под win-CE, но уже из Линукса.
Правда я хочу связку gcc и GTK, а все что нахожу опирается на MinGW. Это описание окон и кнопок средствами Windows.
Мне это не подходит, т.к. я из Windows делал это используя Pelles-C.
Похоже есть какие-то непреодолимые трудности, чтобы к ce-gcc “прикрутить” библиотеки GTK.
Нашел всего одну разработку gtk-wince, но она упорно не хочет компилиться.

Алексей, позвольте мне ответить.
Работать от СВОЕЙ базы удобней и надежней. И все претензии - только к себе. Да и сеть от нее потом можно развить - локальную, близкую, свою.

Вот поэтому я и предлагал выполнить изменрения на двух точках, расстояние между которыми можно измерить рулеткой.
А двухчастотник не всем доступен.
Алексей. Похоже станция NNOV вылетает из-за удаленности запредельной для измерений одночастотным приемником.
Но точность измерений вектора cheb - gag2 как бы это сказать - на воде вилами писана. Нужна 2-я точки и расстояние до нее от 1-й измеренное руками.
А какой разброс координат Вашей точки gag2 получается, если разделить 5 суток на 5 отдельных суточных сессий?

-1

Возможно я не совсем ясно выразился тогда.
У Гармина есть СВОЙ гарминовский бинарный протокол для работы с приемниками на чипсетах SirfStar-II и SirfStar-II, это не Sirf-протокол.
И я знаю команды переключения NMEA ↔ Garmin-binary для гарминовских девайсов на SS-II и SS-III. :smiley:

-1

-1

-1

-1

-1

Не вопрос, вот они:

	char GarminNMEA[11] = {0x24, 0x50, 0x47, 0x52, 0x4D, 0x4F, 0x2C, 0x2C, 0x53, 0xD, 0xA};
	char GarminStop[8] = {0x10, 0x1C, 0x02, 0x00, 0x00, 0xE2, 0x10, 0x03};
	char GarminStart[8] = {0x10, 0x1C, 0x02, 0xFF, 0xFF, 0xE4, 0x10, 0x03};

А это чуть подробней - кусок кода из find_device.c:

int DetermineDevice(int devicenum)
{
    int retval;
	char GarminNMEA[11] = {0x24, 0x50, 0x47, 0x52, 0x4D, 0x4F, 0x2C, 0x2C, 0x53, 0xD, 0xA};
	char GarminStop[8] = {0x10, 0x1C, 0x02, 0x00, 0x00, 0xE2, 0x10, 0x03};
	char GarminStart[8] = {0x10, 0x1C, 0x02, 0xFF, 0xFF, 0xE4, 0x10, 0x03};

/* ... ... ... */

	//switch (PORT_INIT.idevice)
	switch (devicenum)
	{
    // найти NMEA-строку, переключить приемник в бинарный режим, получить самоидентификацию и альманах
	case 0:  // Garmin Receiver or Navigator NMEA
	/*-----------------------------------------------------------------------*/
		/* NMEA-MODE ДЛЯ Garmin ПРИЕМНИКОВ ПРИ СКОРОСТИ 4800 БОД */
		if (PORT_INIT.iSpeed == 4800)  // 4800 bod
		{
		    blnSirfStarProtocol = 0;
            // Maybe NMEA-Data in COM-port! Is Garmin GPS25/35 & NMEA-mode?
            retval = read(fdport, bRead, BUFSIZE);
            if (retval > 6)
            {
                for (i=0; i <= retval-3; i++)
                {
                    // проверить ответ приемника, если в ответе есть $GPG - то это NMEA-mode 4800 bod
                    if (bRead[i] == '\x24' && bRead[i+1] == '\x47' && bRead[i+2] == '\x50' && bRead[i+3] == '\x47')
                    {
                         // переключить приемник в Bynary-mode - послать строку "$PGRMO,,S"
                        retval = write(fdport, GarminNMEA, 11);
                        if (retval == 11)  // и выйти из программы для подключения УЖЕ в BINARY-mode!
                        {
                            printf( "Receiver was set in Binary-mode,\nNow please REOPEN program!\n");
                            //strMsg = "Receiver was set in Binary-mode\nNow please REOPEN program!";
                            //msgbox();
                            close(fdport);  // close serial-port
                            return 0;
                        }
                        else // переключение не удалось
                        {
                            //printf( "Unable switch Garmin-NMEA to Garmin-BINARY!\n");
                            strMsg = "Unable switch Garmin-NMEA\n to Garmin-BINARY mode!";
                            msgbox();
                            return 0;
                        }
                    }
                }
                if (i > retval-4)  // цикл закончен, а NMEA-строка не найдена
                {
                    //printf( "Garmin-NMEA search:\nNOT found NMEA Message!\n");
                    strMsg = "Garmin-NMEA search:\nNOT found NMEA Message!";
                    msgbox();
                return 0;
                }
            }
		}

/* ... ... ... */

	case 1:  // Garmin GPS25/35/18 Receiver Binary
	/*-----------------------------------------------------------------------*/
		blnIsNavigator = 0;
		blnSirfStarProtocol = 0;

        fsync(fdport);  // очистить буферы COM-порта
        retval = write(fdport, GarminStop, 8);  // Закрыть порт GPS
        retval = write(fdport, GarminStart, 8);  // Открыть порт GPS
        if (retval < 8)
        {
            printf("Start Garmin receiver BIN-mode...\nCommand was NOT write!\n");
            return 0;
        }

        sleep(2);  // задержка перед чтением ответа
        retval = read(fdport, bRead, BUFSIZE);
		// в цикле найти характерные для приемника Message_28 или Message_29
		for (i=0; i<=retval-2; i++)
		{
			if ((bRead[i]==0x10 && bRead[i+1]==0x28 && bRead[i+2]==0x36) || (bRead[i]==0x10 && bRead[i+1]==0x29 && bRead[i+2]==0xE2))
			{
				break;
			}
			else if (i>=retval-2)
			{
				printf("Find BIN-mode Message: NOT found correspond Message!\n");
				 return 0;
			}
		}
		// получить самоидентификацию GarminGPS приемника
		if (GarminGPS_ID() == 0)
		{
			printf("Select Garmin GNSS-Device...\nNot found Garmin GPS25/35 Binary-data\n");
			return 0;
		}
		if (GarminAlmDown() < 28)
		{
			printf("Bad almanac count,\nless than 28 satellits\n");
			return 0;
		}

		// если есть альманах, получить эфемериды спутников
		if (GarminEphDown() < 4)
		{
			printf("Bad ephemeris count,\nless than 4 satellits\n");
			return 0;
		}

		if (GarminDateTimeCoords() < 1)
		{
			printf("Bad Date-Time-Coords,\nExit!\n");
			return 0;
		}

		// После получения альманаха и эфемерид порт Garmin'а закрыт,
		// поэтому включить бинарный поток и перейти к парсингу
        fsync(fdport);  // очистить буферы COM-порта
        retval = write(fdport, GarminStop, 8);  // Закрыть порт GPS
        retval = write(fdport, GarminStart, 8);  // Открыть порт GPS
        if (retval < 8)
        {
            printf("Start Garmin GPS25/35/18 receiver: Command was NOT write!\n");
            return 0;
        }
		break;

	case 2:  // Garmin GPS72/eTrex Navigator Binary  Garmin GPSMap60 Navigator Binary
	/*-----------------------------------------------------------------------*/
		blnIsNavigator = 1;
		blnSirfStarProtocol = 0;

        fsync(fdport);  // очистить буферы COM-порта
        retval = write(fdport, GarminStop, 8);  // Закрыть порт GPS
        retval = write(fdport, GarminStart, 8);  // Открыть порт GPS
        if (retval < 8)
        {
            printf("Start Garmin GPS72/eTrex/Map60: Command was NOT write!\n");
            return 0;
        }

        sleep(2);  // задержка перед чтением ответа
            retval = read(fdport, bRead, BUFSIZE);
            printf("Find BIN-mode Message: readed %d bytes\n", retval);
		if (retval > 12)
		{
			// в цикле найти характерные для приемника Message_36 или Message_38
			for (i=0; i<=retval-2; i++)
			{
				if ((bRead[i]==0x10 && bRead[i+1]==0x36 && bRead[i+2]==0x0C)
                    || (bRead[i]==0x10 && bRead[i+1]==0x38 && bRead[i+2]==0x28))
				{
					printf("Find BIN-mode Message: Found correspond Message %x\n", bRead[i+1]);
					break;
				}
				else if (i>=retval-2)
				{
                    printf("Garmin GPS72/eTrex/Map60: NOT found correspond Message!\n");
                    return 0;
				}
			}
		}

// закрыть порт, мусор потока не нужен - команды будут дискретные
retval = write(fdport, GarminStop, 8);  // Закрыть порт GPS
fsync(fdport);  // очистить буферы COM-порта
		// получить самоидентификацию GarminGPS приемника
		if (GarminGPS_ID() < 1)
		{
			printf("Select Garmin Navigator:\nNot found Garmin GPS72/eTrex Binary-data\n");
			return 0;
		}
		else GarminAlmDown();   // если есть самоидентификация, получить альманах спутников
		// эфемериды Garmin-навигатры не выдают, но после получения альманаха порт Garmin'а закрыт,
		// поэтому включить бинарный поток и перейти к парсингу
			fsync(fdport);  // очистить буферы COM-порта
			retval = write(fdport, GarminStop, 8);  // Закрыть порт GPS
			retval = write(fdport, GarminStart, 8);  // Открыть порт GPS
			if (retval < 8)
			{
				printf("Start Garmin Navigator BIN-mode...\nCommand was NOT write!\n");
				return 0;
			}
		//if (GarminDTC() < 1)
		if (GarminDateTimeCoords() < 1)
		{
			printf("Selected Garmin Navigator:\nNot found Date-Time-Coords\n");
			return 0;
		}
		break;

	case 3:  // Garmin GPSMap6xx/7xx Navigator Binary
	/*-----------------------------------------------------------------------*/
		blnIsNavigator = 1;
		blnSirfStarProtocol = 0;

        fsync(fdport);  // очистить буферы COM-порта
        retval = write(fdport, GarminStop, 8);  // Закрыть порт GPS
        retval = write(fdport, GarminStart, 8);  // Открыть порт GPS
        if (retval < 8)
        {
            printf("Start Garmin Navigator BIN-mode:\nCommand was NOT write!\n");
            return 0;
        }

        sleep(2);  // задержка перед чтением ответа
            retval = read(fdport, bRead, BUFSIZE);
        printf("Find BIN-mode Message: readed %d bytes\n", retval);
		if (retval > 12)
		{
			// в цикле найти характерные для приемника  Message_33 или Message_72 или Message_99
			for (i=0; i<=retval-2; i++)
			{
			if ((bRead[i]==0x10 && bRead[i+1]==0x33 && bRead[i+2]==0x40)
                || (bRead[i]==0x10 && bRead[i+1]==0x72 && bRead[i+2]==0x54)
                || (bRead[i]==0x10 && bRead[i+1]==0x99 && bRead[i+2]==0x78))
				{
					printf("Find BIN-mode Message: Found correspond Message %x\n", bRead[i+1]);
					break;
				}
				else if (i>=retval-2)
				{
                    printf("Garmin GPSMap6xx/7xx: NOT found correspond Message!\n");
                    return 0;
				}
			}
		}

// закрыть порт, мусор потока не нужен - команды будут дискретные
retval = write(fdport, GarminStop, 8);  // Закрыть порт GPS
fsync(fdport);  // очистить буферы COM-порта
		// получить самоидентификацию GarminGPS приемника
		if (GarminGPS_ID() < 1)
		{
			printf("Select Garmin GNSS-Device...\nNot found Garmin GPSMap6x/7x Binary-data\n");
			return 0;
		}
		else GarminAlmDown();   // если есть самоидентификация, получить альманах спутников
		{
		// эфемериды Garmin-навигатры не выдают, но после получения альманаха порт Garmin'а закрыт,
		// поэтому включить бинарный поток и перейти к парсингу
			fsync(fdport);  // очистить буферы COM-порта
			retval = write(fdport, GarminStop, 8);  // Закрыть порт GPS
			retval = write(fdport, GarminStart, 8);  // Открыть порт GPS
			if (retval < 8)
			{
				printf("Start Garmin Navigator BIN-mode...\nCommand NOT write!\n");
				return 0;
			}
        }
		if (GarminDateTimeCoords() < 1)
		{
			printf("Select Garmin Navigator:\nNot found Date-Time-Coords\n");
			return 0;
		}
		break;

/* ============================ SirfStar devices =========================== */

	case 4:  // SirfStar-II -  если NMEA-mode, переключить приемник в бинарный режим,
	/*-----------------------------------------------------------------------*/


To usm78-gis
Ответ на:

Дело в том, что я не знаю совсем *.rc в Win32/WinCE.
так уж получилось, что освоил только “рукопашный” вариант создания окошек-кнопочек.
Вот и перейдя в Линукс, использую библиотеки GTK, но окна-кнопочки рисую “врукопашную”.

Примерно так в Win - main_windows.c:


#include "main.h"     // UNCOMMENT THIS IF YOU USE THIS HEADER.

// main function.
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinst, LPTSTR cmdline, int show)
{
	instance = hinstance;
    ////InitCommonControls();  // КАК ВЫЯСНИЛОСЬ, ЭТА ИНИЦИАЛИЗАЦИЯ НЕ НУЖНА!!!
	register_classes();
	// Manually added:
	strcpy(lf.lfFaceName, TEXT("Tahoma"));
      lf.lfHeight = -11;
      lf.lfWeight = FW_BOLD;
      lf.lfQuality = DEFAULT_QUALITY;
      h_font = CreateFontIndirect(&lf);
	strcpy(lf.lfFaceName, TEXT("MS Sans Serif"));
	h_font2 = CreateFontIndirect(&lf);  // Manually added !!!
/*
	h_font = CreateFontIndirect(-12, 0, 0, 0, FW_BOLD, 0,  // FW_NORMAL
				0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
				DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "ARIAL");  //"Times New Roman"
	// Manually added:
	h_font2 = CreateFontIndirect(-10, 0, 0, 0, FW_BOLD, 0,  //-13, 0, 0, 0, FW_NORMAL, 0,
				0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
				DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif");  //"Times New Roman");
*/
	create_wnd0();
	create_wnd1();
	create_wnd2();
	create_wnd3();
	create_wnd4();
	create_wnd5();
	create_wnd6();

	// Manually added:
	// скрыть все созданные окна, кроме первого (ГЛАВНОГО)
	ShowWindow(hwnd1, SW_HIDE);
	//UpdateWindow(hwnd1);
	ShowWindow(hwnd2, SW_HIDE);
	ShowWindow(hwnd3, SW_HIDE);
	ShowWindow(hwnd4, SW_HIDE);
	ShowWindow(hwnd5, SW_HIDE);
	ShowWindow(hwnd6, SW_HIDE);

	return message_loop();
}

// LRESULT CALLBACK wnd_procXX() процедура вызова для каждого окна программы:
// window procedure #0 [GNSS_monitor]. It's MAIN-WINDOW that has 6 Command-buttons only (Menu-analog)
LRESULT CALLBACK wnd_proc0(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
	// Manually added:
	//ShowWindow(hwnd0, SW_HIDE);  // скрыть текушее окно 0 (ГЛАВНОЕ)
	//UpdateWindow(hwnd0);
	switch (msg)
	{
	case WM_COMMAND:
		switch (LOWORD(wparam))
		{
		case IDC_BUTTON1:	// button "2_Mode"
			////MessageBox(hwnd, TEXT("the button IDC_BUTTON1 is clicked."), TEXT("Event"), MB_OK|MB_ICONINFORMATION);
			// Manually added:
			ShowWindow(hwnd2, SW_SHOW);  // открыть окно 2 МОДА
			UpdateWindow(hwnd2);
			break;

		case IDC_BUTTON4:	// button "5_Meassurement"
			////MessageBox(hwnd, TEXT("the button IDC_BUTTON4 is clicked."), TEXT("Event"), MB_OK|MB_ICONINFORMATION);
			// Manually added:
			ShowWindow(hwnd5, SW_SHOW);  // открыть окно 5 ИЗМЕРЕНИЕ
			UpdateWindow(hwnd5);
			break;

// LRESULT CALLBACK wnd_procXX() для каждого окна программы:
// window procedure #1 [Files].
LRESULT CALLBACK wnd_proc1(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
// ... ... ...
// и так далее ...

// create window #0 [GNSS_monitor] - здесь параметры окна
HWND create_wnd0()
{
	HWND wnd;
	wnd = CreateWindowEx(0x00020000, WND_CLASS_NAME0, TEXT("GNSS_monitor"), 0x14CF0000, 0, 0, 236, 299, NULL, NULL, instance, NULL);
	ShowWindow(wnd, SW_SHOWNORMAL);
	UpdateWindow(wnd);
	// Manually added:
	hwnd0 = wnd;  // записать дескриптор окна
	return wnd;
}
// ... ... ...
// и так далее ...

// create window content #0 [GNSS_monitor] - здесь параметры кнопочек-рюшечек окна
void create_wnd_content0(HWND parent)
{
	HWND wnd;
	////wnd = CreateWindowEx(0x00000000, TEXT("msctls_statusbar32"), TEXT("Current_Info"), 0x50000000, 0, 253, 230, 21, parent, (HMENU) IDC_STATUS0, instance, NULL);
	hStatusBar = CreateWindowEx(0x00000000, TEXT("msctls_statusbar32"), TEXT("Current_Info"), 0x50000000, 0, 253, 230, 21, parent, (HMENU) IDC_STATUS0, instance, NULL);
	SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
	wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("6_SKY"), 0x50012F00, 117, 179, 112, 68, parent, (HMENU) IDC_BUTTON5, instance, NULL);
	SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
	wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("4_Surveying"), 0x50012F00, 117, 107, 112, 66, parent, (HMENU) IDC_BUTTON3, instance, NULL);
	SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
	wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("2_Mode"), 0x50012F00, 117, 36, 111, 66, parent, (HMENU) IDC_BUTTON1, instance, NULL);
	SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
	wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("5_Meassurement"), 0x50012F00, 0, 179, 112, 68, parent, (HMENU) IDC_BUTTON4, instance, NULL);
	SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
	wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("3_Connect"), 0x50012F00, 0, 107, 112, 66, parent, (HMENU) IDC_BUTTON2, instance, NULL);
	SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
	wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("1_Files"), 0x50012F00, 0, 36, 112, 66, parent, (HMENU) IDC_BUTTON0, instance, NULL);
	SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
	wnd = CreateWindowEx(0x00000000, TEXT("ToolbarWindow32"), TEXT(""), 0x50000001, 0, 0, 230, 28, parent, (HMENU) IDC_TOOLBAR0, instance, NULL);
	SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
}
// ... ... ...
// и так далее ...

// а в конце main.c:
// register all the window classes.
void register_classes()
{
	WNDCLASS wc;

	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
	wc.hInstance     = instance;
	wc.lpszMenuName  = NULL;
	wc.style         = CS_PARENTDC | CS_DBLCLKS;

	wc.lpfnWndProc   = wnd_proc0;
	wc.lpszClassName = WND_CLASS_NAME0;
// ... ... ...
// и так далее ...

// и главный цикл программы
// message loop.
int message_loop()
{
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	DeleteObject(h_font);
	return msg.wParam;
}
/* End of file main_windows.c */

Примерно так в Lin - main.c:


/* makes the widget-dialog "Message Box", used global string strMsg for messages */
GtkWidget* msgbox (void)
{
    GtkWidget *msgbox; // non-modal dialog
    GtkWidget * content_area;
    GtkWidget * label;
    //strMsg = "Test MessageBox";

    msgbox = gtk_dialog_new_with_buttons ("Message Box", NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                                 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);

   content_area = gtk_dialog_get_content_area (GTK_DIALOG (msgbox));
   label = gtk_label_new (strMsg);
   gtk_container_add (GTK_CONTAINER (content_area), label);
   gtk_widget_show_all (msgbox);

    if (gtk_dialog_run(GTK_DIALOG (msgbox)) == GTK_RESPONSE_OK)
    gtk_widget_destroy (msgbox);

  return msgbox;
}
/*---------------------------------------------------------------------------*/

/* creates here main window and invokes from here all addition windows */
int main (int argc, char *argv[])
{
    OpenFiles=0;  // set global variable - files was not opened
    GtkWidget* win0;

    gtk_disable_setlocale ();  // to disable locale RU numbers as 123,456 insted 123.456

    gtk_init (&argc, &argv);

    win0 = create_window0();  // ON START OF PROGRAM CREATES ONLY FIRST WINDOW - window0

    /* switch - manipulate of all windows */

    gtk_main();
    return 0;
}

/* а все окна с их кнопочками-рюшечками в файле inerface.c: */
#include "main.h"
/*
GtkWidget* create_window0 (void)
GtkWidget* create_window1 (void)
GtkWidget* create_window2 (void)
GtkWidget* create_window3 (void)
GtkWidget* create_window4 (void)
GtkWidget* create_aboutdialog1 (void)
*/
/* Forward declarations */

/* callback-functions joined with some widgets in CURRENT WINDOW of program */

/* Callback-functions for invoked-buttons from main window0 */

/*---------------------------------------------------------------------------*/

/* makes the window 0 "GNSS Monitor", creates here main window and invokes from here all additional windows */
GtkWidget* create_window0 (void)
//GtkWindow* create_window0( void )
{
    GtkWidget *tablebox;  // GtkWidget GtkTable
    GtkWidget *vbox, *hbox;
    //GtkWidget *checkbox1, *checkbox2; // removed to global
    GtkWidget *button0, *button1, *button2, *button3, *button4, *button5, *button6;
    GtkWidget * statusbar;
    //GtkStatusbar * statusbar;
    const gchar *title = "GNSS Monitor";

    /* Standard window-creating stuff */
    window0 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position (GTK_WINDOW(window0), GTK_WIN_POS_CENTER_ALWAYS);
    gtk_window_set_title (GTK_WINDOW (window0), title);
    gtk_widget_set_usize(window0, 250, 200);

    /* create widgets on current window */
    checkbox1 = gtk_check_button_new_with_label ("BASE");
    checkbox2 = gtk_check_button_new_with_label ("ROVER");
    gtk_toggle_button_set_active(checkbox2, TRUE); // ROVER is active BY DEFAULT
    button0 = gtk_button_new_with_label("  E  X  I  T  ");
    button1 = gtk_button_new_with_label("FILES");
    button2 = gtk_button_new_with_label("SETTINGS");
    button3 = gtk_button_new_with_label("CONNECT");
    button4 = gtk_button_new_with_label("SKY");
    button5 = gtk_button_new_with_label("SURVEYING");
    button6 = gtk_button_new_with_label("ABOUT");

    /* create vertical-box frame on current window */
    vbox = gtk_vbox_new (FALSE, 3);
    gtk_container_add (GTK_CONTAINER (window0), vbox);

    hbox = gtk_hbox_new (FALSE, 3);
    //gtk_container_add (GTK_CONTAINER (vbox), hbox);
    //gtk_container_add (GTK_CONTAINER (hbox), checkbox1);
    //gtk_container_add (GTK_CONTAINER (hbox), checkbox2);
    //gtk_container_add (GTK_CONTAINER (hbox), button0);

    /* create statusbar widget on current window */
    statusbar = gtk_statusbar_new();
    gchar *string = "Info-text in statusbar";
    gtk_statusbar_push (statusbar, 0, string);  // widget_name, index_in_widget_string, contecst_to_insert

    /* create table-box frame in vbox-frame on current window */
    tablebox = gtk_table_new (4, 2, TRUE); // 4 rows x 2 colons
    gtk_table_set_col_spacings(tablebox, 3);
    gtk_table_set_row_spacings(tablebox, 3);
    gtk_container_add (GTK_CONTAINER (vbox), tablebox);
    gtk_widget_show (tablebox);

    /* set 6 buttons & statusbar to table-box frame */
    gtk_table_attach_defaults (tablebox, button1, 0, 1, 0, 1);
    gtk_table_attach_defaults (tablebox, button2, 1, 2, 0, 1);
    gtk_table_attach_defaults (tablebox, button3, 0, 1, 1, 2);
    gtk_table_attach_defaults (tablebox, button4, 1, 2, 1, 2);
    gtk_table_attach_defaults (tablebox, button5, 0, 1, 2, 3);
    gtk_table_attach_defaults (tablebox, button6, 1, 2, 2, 3);
    /* set 2 checkboxes & EXIT button to table-box frame */
    gtk_table_attach_defaults (tablebox, hbox, 0, 2, 3, 4);
    gtk_container_add (GTK_CONTAINER (hbox), checkbox1);
    gtk_container_add (GTK_CONTAINER (hbox), checkbox2);
    gtk_container_add (GTK_CONTAINER (hbox), button0);
    /* statusbar to table-box frame */
    gtk_table_attach_defaults (tablebox, statusbar, 0, 2, 4, 5);

    /* reaction widget -> signal - invoke callback-functions */
    g_signal_connect(G_OBJECT(window0), "delete_event", G_CALLBACK(delete_event), NULL);
    g_signal_connect(G_OBJECT(window0), "destroy", G_CALLBACK(destroy), NULL);
    /* by pressing button0 callback-func. 'destroy() call system-func gtk_main_quit() over gtk_widget_destroy() */
    g_signal_connect(G_OBJECT(button0), "clicked", G_CALLBACK(button0_clicked), (gpointer)"button0");
    /* by pressing button0 callback-func. button0_clicked() swap parameter with system-func. gtk_widget_destroy() */
    g_signal_connect_swapped(G_OBJECT(button0), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(window0));

    /* reaction widget -> signal - invoke callback-functions to OPEN slave-windows */
    /* It is program-menu - de'facto !!! */
     /* by pressing heckbox callback-func. on_button_checkbox_clicked ("BASE" "ROVER") */
    g_signal_connect(G_OBJECT(checkbox1), "clicked", G_CALLBACK(on_button_checkbox_clicked), (gpointer)"checkbox1");
    g_signal_connect(G_OBJECT(checkbox2), "clicked", G_CALLBACK(on_button_checkbox_clicked), (gpointer)"checkbox2");
    g_signal_connect (G_OBJECT(button1), "clicked", G_CALLBACK (on_button1_clicked), NULL);
    g_signal_connect (G_OBJECT(button2), "clicked", G_CALLBACK (on_button2_clicked), NULL);
    g_signal_connect (G_OBJECT(button3), "clicked", G_CALLBACK (on_button3_clicked), NULL);
    g_signal_connect (G_OBJECT(button4), "clicked", G_CALLBACK (on_button4_clicked), NULL);
    g_signal_connect (G_OBJECT(button5), "clicked", G_CALLBACK (on_button5_clicked), NULL);
    g_signal_connect (G_OBJECT(button6), "clicked", G_CALLBACK (on_button6_clicked), NULL);

    /* now show all created widgets & window */
    gtk_widget_show_all (window0);

    // before view window0, view MessageBox
    strMsg = "    ORDER OF WORK THIS PROGRAM:\n1.FILES select folder for write files\n  of new job, or select existing bin-file\n2.SETTINGS set device, port-attributes\n3.CONNECT connect to device\n4.SURVEYING describe job points/line\n5.SKY view satellities on sky &  power\n signals from satellities.\n  Now press OK button to continue...";
    msgbox();

    return window0;
}
/* end od function create_window0() */
/*---------------------------------------------------------------------------*/

Подойдет, нет?

Мне в описаниях девайса почемуто не встретилось Sirf-II, пишут Sirf-III
Лирическое отступление:
Некоторое время тому назад я прикупил разные модели (подержанные, но работоспособные) для тестирования “по приемлемой цене”.
В том числе и Mitac Mio P550
http://www.3dnews.ru/mobile/mitac_mio_p550/
http://www.ixbt.com/pda/mio-p550.shtml
http://www.avito.ru/items/moskva_planshety_i_aelektronnye_knigi_kpk_mitac_mio_p550_digiwalker_gps_80569564
Причем бывший хозяин принес к полному комплекту и внешнюю антенну с MMCX-разъемом (купленную отдельно).

Таким же образом (по объявлению) купил HTC P3300 (Artemis), внешняя антенна в комплекте.
Но в нем процессор OMAP850 (201 MHz) и это уже смартфон, а не HHPC.
http://www.3dnews.ru/mobile/htc-p3300_qtek-g100
http://www.hpc.ru/devices/36887
http://www.ixbt.com/news/hard/index.shtml?06/76/98
Простой телефон много удобней его, а до наладонника недотягивает размерами.
GPS модуль работает нормально, особенно “богатый” прием сигналов с внешней антенной.

Теперь эти девайсы просто лежат на полке, потому что навигатор Mitac MIO C-520 (например) оказался много удобней.
Но есть у меня подозрение, что навигационная часть подобных устройств (особенно от Mitac MIO) сделана заметно качественней/богаче, чем в том большом хороводе навигаторов, которые предлагают сейчас.
Я имею в виду возможность получать нечто большее, чем только NMEA-сентенции выведенные на карту Навител.
Конец лирического отступления.

usm78-gis - а к какому девайсу Вам потребовался Гарминовский протокол? Что-то я пропустил при чтении.

-1

usm78-gis

По форме один-в-один с навигатором Garmin GPS-72 (SirfStar-II), по наполнения очень похож на навигаторы серии Garmin GPSMap-60xxx.
Если я правильно понимаю, то Ваш навигатор может выдавать бинарные (Garmin-bin):
Message_0x33, Message_0x72, Message_0x99 в потоке по умолчанию.

// Position Record 0x33 (Position, velocity, time) 10 33 40 .. - 64 bytes
// ЭTO OCHOBHOE NAVIGATION COOБЩEHИE "ПOЗИЦИЯ-TOЧHOCTЬ-BPEMЯ-CКOPOCTЬ" ВЫЧИСЛЯЕМОЕ ПРИЕМНИКОМ
typedef struct
{
     float Alt; // altitude above WGS84 ellipsoid (m) - 32 bit
     float EstErr; // Estimated position error, 2 sigma (m) - 32 bit
     float HErr; // Horiz. position error (m) - 32 bit
     float VErr; // Vertical position error (m) - 32 bit
     int Fix; // Type of fix - 16 bit
     double TOW; // Time 0f Week (sec) - 64 bit
     double Lat; // Latitude (rad) - 64 bit
     double Lon; // Longitude (rad) - 64 bit
     float Evel; // Velocity East (m) - 32 bit
     float Nvel; // Velocity North (m) - 32 bit
     float Uvel; // Velocity Up (m) - 32 bit
     float hMSL; // height of WGS84 ellipsoid above MSL(m) - 32 bit
     short Leap; // Leap (sec) - 16 bit
     unsigned long WNDays; // Garmin Week Number Days - 32 bit
    // The wn_days parameter provides the number of days that have occurred
    // from UTC December 31st, 1989 to the beginning of the current week
    // To find the total number of days that have occurred from UTC December 31st, 1989
    // to the current day, add wn_days to the number of days that have
    // occurred in the current week (as calculated from the tow  parameter).
} Message_33;

// Navigation Record 0x72 () 10 72 54 .. - 84 bytes (7*12) для oтoбpaжeния cпутникoв нa нeбocвoдe 
// ЭTO NAVIGATION COOБЩEHИE ("Небосвод") ДЛЯ 12-TИ CПУTHИКOB
typedef struct
{
     BYTE Prn; //
     short Signal; //
     BYTE Elevat; //
     short Azimuth; //
     BYTE Status; //
} Message_72;

// Record 0x99 - 120 bytes - unknown data!
typedef struct
{
	... ... ... ???
} Message_99;

// некоторые фрагменты идентифицировал, но полной картины сообщения не понял, поэтому забросил.

И по запросу пользователя date-time, POS, almanac:
Time

запрос 0x10, 0x06, 0x02, 0x11, 0x00, 0xE7, 0x10, 0x03, 0x10, 0x0A, 0x02, 0x05, 0x00, 0xEF, 0x10, 0x03
ответ 10 06 02 0A 00 EE 10 03
10 0E 08 07 11 DA 07 11 00 15 2A A1 10 03
где:
07 = 7 - месяц (июль), 11 = 17 - день месяца, DA 07 = 2010 - год и время час. мин. сек.

Position

запрос 10 06 02 FD 00 FB 10 03 10 0A 02 02 00 F2 10 03
ответ 10 06 02 0A 00 EE 10 03
10 11 10 10 CC 03 61 73 1D 15 EF 3F CB EE 9E F1 5B FB E4 3F 1B 10 03
где:
CC 03 61 73 1D 15 EF 3F = 0.97132752 B(Latitide)широта (радиан)
CB EE 9E F1 5B FB E4 3F = 0.65568349 L(Longitude)долгота (радиан)

// Record 0x1F - Almanac record - navigator send 32*(10 1F 2E .. 10 03)=46*32 bytes for all Navstar satellities
typedef struct
{
     int WN; //
     float toa; //
     float af0; //
     float af1; //
     float e; //
     float sqrta; //
     float m0; //
     float w; //
     float omg0; //
     float odot; //
     float i; //
     int uk1; //
     BYTE uk2; //
     BYTE SVID; //
} Message_1F;

Бинарные записи - навигатор GPSMap60cx

Файл GPS-Map60cx_all.bin 20-03-2008 12:12:14
НАЧАЛО

102702101000C71003
107254019CFF14AC0004099CFF0F3F000420D0113CE000151C80070B51010403081125CA00150B0E10100D2501150E9CFF2A950004129CFF1E430004159CFF036F0004169CFF4655000413161239F4001525E70D18C50004B21003
1099780E00040003979E00BF01000097152A796121EF3F3B1AAD9CEB07E53F00000000B41C174100000000B41C1741072337BEFA1614BEEC51B83DC3F53C431F856B3E97750940B0721A423D0AD7407389A341666616416666164100000000000000002FDD643FFAB3923D95050EBFBF05000000000400000000007A1003
103340C3F53C437389A341B0721A423D0AD740030000000000B41C174197152A796121EF3F3B1AAD9CEB07E53F072337BEFA1614BEEC51B83DFE8B74C10E00FA190000AA1003

СРЕДИНА

102702101000C71003
1072540998080F3D000416D00745530005203E123CE00015019CFF16AC000403EA101025CA00150BB40F0D2501150E9CFF2A950004129CFF1E430004159CFF036F00041C9CFF0B53010413661239F40015FF000000000000131003
1099780E00040096D19E00BF0100008AAB9AFB6021EF3F15D19FA3E907E53F00000000F01C174100000000F01C17414A32233EAF1E683C0AD7233D14EE3E430AD7233E97750940EC51B441C3F5C840F56C4E41CDCC0C40CDCC0C4000000000000000002FDD643FFAB3923D95050EBFBF0500000000040000000000EC1003
10334014EE3E43F56C4E41EC51B441C3F5C840030000000000F01C17418AAB9AFB6021EF3F15D19FA3E907E53F4A32233EAF1E683C0AD7233DFE8B74C10E00FA1900009E1003

КОНЕЦ

102702101000C71003
1072540956090F3D000416980845530005207A123CE00015019CFF16AC000403E0101025CA00150B770F0D2501150E9CFF2A950004129CFF1E430004159CFF036F00041C9CFF0B530104133E1239F40015FF000000000000BE1003
1099780E00040018009F00BF01000018879B10105F21EF3FAAC9FBB6E107E53F00000000201D174100000000201D174146A7B7BEAA594BBEEC51383ED723434385EBD13E977509403F35A641295CCF40FCE44341CDCC0C40CDCC0C4000000000000000002FDD643FFAB3923D62B20DBFBF0500000000040000000000AF1003
103340D7234343FCE443413F35A641295CCF40030000000000201D174118879B10105F21EF3FAAC9FBB6E107E53F46A7B7BEAA594BBEEC51383EFE8B74C10E00FA190000FA1003

Это все, что я смог получить из аналогичного навигатора Garmin GPS-Map-60cx

Хорошо (как все навигаторы) отдает треки и точки навигации, например:

Retrieve waypoints
100A020700ED1003
86009878E61E1E98F818861E9878061E00189E9806068600981E1E98E61878067E06860698E086069898866098006680988060867E9800660666986098E086E086606678189E981E0686E086988660981EE680988060867E9800669E66986660E0861818E698E6188680189E18660686189878861EF8861E189E981E068600188600189E1898E08600188600189E988606860698988618988066809880608600666018661E6660E08666188660189E981E068660188686189E981E06867E18861E189E981E86668678861EE6809880608600666018661E869E068678181E7E189E1878E0861E18666678E68066809880608600666018661E6698E0867E66601E6600C3C018E618660678861EE680988060867E9800668666986606068606189E98E0189E98E0068698861E981EE6809880
1006020A00EE1003
Ok, receiver is sending data
1006022300D51003
101B020700DC1003
**** Start **** 7 records to be received
1006022300D51003
10234A01001F805C20000000000000FFFFFFFFFFFFFFFFFFFFFFFFE06FA11B9D5D96BC4886A243515904695159046920202020FFFFFFFF515904690000000000004761726D696E0000000000005A1003
[Waypoints]
==00;00.0000;N;000;00.3296;W;яяяяяяаoЎќ]–јH†ўCQYiQYi    яяяяQYi~000000004761726D696E000000000000
1006022300D51003
10235101001F805C20000000000000FFFFFFFFFFFFFFFFFFFFFFFF922641245181F5FE20BD0F42515904695159046920202020FFFFFFFF515904690000000000004761726D696E204575726F7065000000000000BD1003
==00;00.0000;N;000;00.3296;W;яяяяяя’&A$QЃхю ЅBQYiQYi    яяяяQYi~000000004761726D696E204575726F7065000000000000
1006022300D51003
10235101001F805C20000000000000FFFFFFFFFFFFFFFFFFFFFFFFC25BD2114DEF7F5600641842515904695159046920202020FFFFFFFF515904690000000000004761726D696E2054616977616E0000000000000A1003
...
...
100C020700EB1003
**** Complete ****    7 records processed

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

P.S.
Message_0x33 можно использовать для изощренных вычисления координат точек и даже попытаться выполнить псевдо-дифф.обработку в связке с таким же приемником на пункте “БАЗА”.
Я последнее время склоняюсь к такой обработке данных полученных от бытовых приемников-навигаторов.
Полагаю, что можно получать координаты “РОВЕРА” от 1.0 метра и меньше (если “РОВЕР” на каждой точке будет стоять 30–60–120 сек. или больше)…

To Alexey Illarionov
Алексей! Есть успехи/новости с определением координат Вашей базовой станции?

To usm78-gis
Что выдает GPSmap76Cx ?

Тишина… Это жарко и отпуска, или тема “завяла”?
chnav совсем ничего не пишет…
А-у-у-у…