Witam szanownych kolegów i koleżanki. Niestety programiści na innym forum mi nie pomogli, wiec postanowiłem spróbować uzyskać pomoc tutaj. Próbuje napisać program, który zczytuję z portu COM, a następnie wyświetla ciąg otrzymanych znaków.
Urządzeniem podpiętym pod port jest odbiornik GPS i wysyła depesze NMEA w następującej formie: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
Potrzebuje przerobić otrzymany szereg znaków na pozycje: 48 stopni 07,038 minuty N, 011 stopni 31,000 minuty E. Do tej pory udalo mi sie samo wyświetlanie ciągów znaków następującym programem.
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
void system_error(char *name) {
WCHAR ptr[1024];
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
0,
GetLastError(),
0,
//(char *)&ptr,
ptr,
1024,
NULL);
fprintf(stderr, "\nError %s: %s\n", name, &ptr);
LocalFree(ptr);
}
int _tmain(int argc, _TCHAR* argv[])
{
int ch;
char buffer[1];
HANDLE file;
COMMTIMEOUTS timeouts;
DWORD read, written;
DCB port;
HANDLE keyboard = GetStdHandle(STD_INPUT_HANDLE);
HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD mode;
LPCWSTR port_name = L"\\\\.\\COM5";
char init[] = ""; // e.g., "ATZ" to completely reset a modem.
if ( argc > 2 )
swprintf_s((wchar_t *)&port_name, 128,L"\\\\.\\COM%c", argv[1][0]);
// open the comm port.
file = CreateFile(port_name,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
memset(&port, 0, sizeof(port));
port.DCBlength = sizeof(port);
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;
if (!SetCommTimeouts(file, &timeouts))
system_error("setting port time-outs.");
// basic terminal loop:
do {
// check for data on port and display it on screen.
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
if ( read )
WriteFile(screen, buffer, read, &written, NULL);
// check for keypress, and write any out the port.
if ( _kbhit() ) {
ch = _getch();
WriteFile(file, &ch, 1, &written, NULL);
}
// until user hits ctrl-backspace.
} while ( ch != 127);
// close up and go home.
CloseHandle(keyboard);
CloseHandle(file);
return 0;
}