[C con Clase] Puerto Serial en WinAPI
Paul Andree Masias Chacon
paulmasias en yahoo.es
Mar Nov 13 08:21:54 CET 2007
Hola, disculpen la molestia, hice alguna pregunta en el foro , y bueno me ayudaron, mi nombre es Paul Andree Masias Chacon consulte sobre WinAPI y puerto serie, y es q ya e llegado a algunas cosas con mi programa por ejemplo q grafique un cronograma pero esto simulando la entrada con una barra horizontal, lo q necesito ahora es aplicar lo q es la comunicacion serial y bueno aun no e logrado compilar con certeza el archivo q esta en la pagina q me dieron para el puerto serial, y es q al principio me aparecio un problema con el iostream.h pero buscando en internet parece q al cambiar este archivo con otro solucione el problema y es q ahora sucede otro problema al compilar me parece lo siguiente:
64 ...\codigo\pto\serie.cpp invalid conversion from `DWORD (*)(DWORD*)' to `DWORD (*)(void*)'
y la verdad como recien comienzo en esto no se a q se refiere.
Bueno respecto a lo demas, me gustaria saber como podria incluir a mi programa la comunicacion serial, y es q en estos momentos no se me ocurre con certeza algo seguro, si me podrian ayudar con eso??
les paso el codigo de mi programa:
y lo q falta es de al cativar una de las opciones del menu enviar un dato para segun a esto se sepa q sensor sera usado, y despues de esto hacer un bucle recibiendo los datos q seran enviados por un microcontrolador y luego graficarlos en el cronograma q ya tengo.
Les doy las gracias anticipadas
cabe resaltar q no todo el codigo es mio pues me ayudo en mucho el codigo q me paso un ingeniero q trabaja como docente en mi universidad.
///////////////////////////////////////////////////////////////////////////////
tarjeta.cpp
///////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include "BarraHorizontal.h"
#include "TextoEstatico.h"
#define NUMERO_DATOS 300
#include "ids.h"
#define CM_Temperatura 100
#define CM_Tacometro 101
#define CM_Sensor_3 102
#define CM_Sensor_4 103
#define CM_Sensor_5 104
#define CM_SALIR 105
void InsertarMenu(HWND);
const int ID_TIMER = 1; // identificador del temporizador
// sirve para muestrear la señal
// periódicamente
BarraHorizontal barra; // simula la señal de entrada
TextoEstatico texto; // muestra el valor actual de la señal
// define la región donde se graficarán los datos
RECT r = {10, 60, 311, 160};
// La ventana muestra hasta los últimos 301 datos recibidos
int dato[NUMERO_DATOS + 1],
nDatos; // para controlar el número de datos muestreados
// si hay más de 301, los datos comienzan
// a desplazarse sobre la ventana
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
// este mensaje se envía cuando la ventana Windows ha sido creada
case WM_CREATE:
// crea la barra de simulación
barra.CreaVentana(80, 20, 180, 20, // ubicación
0, 100, // rango de la señal
20, // valor inicial de la señal
1, hwnd);
// crea la ventana para mostrar el valor actual de la señal
texto.CreaVentana (20, 20, 40, 20,
"20", // valor inicial
2, hwnd);
nDatos = 0; // inicialmente el número de datos muestreados es 0
for (int i = 0; i <= 300; i++)
dato[i] = 0; // los datos inicializados a cero
// crea el temporizador
SetTimer(hwnd, ID_TIMER,
100, // habilita la captura de
// datos cada 100 milisegundos
NULL);
break;
// este mensaje se recibe cuando se usa la barra de desplazamiento
case WM_HSCROLL:
{
barra.Evento(wParam); // le informa a la barra del cambio
texto.Escribe(barra.Posicion()); // actualiza la ventana de texto
}
break;
// este es el mensaje que se recibe periódicamente
case WM_TIMER:
{
// actualiza los valores del arreglo
if (nDatos == NUMERO_DATOS) // si el arreglo está lleno
{ // se desplazan los datos
for (int i = 0; i < NUMERO_DATOS; i++)
dato[i] = dato[i + 1];
dato[NUMERO_DATOS] = barra.Posicion();
}
else // si el arreglo no está lleno lo va completando
{
dato[nDatos] = barra.Posicion();
nDatos++;
}
// indica a la ventana que actualice la vista
// causa que la ventana se borre y pinte nuevamente con los
// datos actualizados
InvalidateRect( hwnd, &r, true);
}
break;
// se recibe cada vez que se necesita repintar la ventana
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
for (int i = 0; i <= 300; i++)
{
// dibuja un punto
MoveToEx(hdc, r.left + i, r.bottom - dato[i], NULL);
LineTo(hdc, r.left + i, r.bottom - dato[i] + 1);
}
EndPaint(hwnd, &ps);
}
break;
// se envía este mensaje cuando la aplicación se va a cerrar
case WM_CLOSE:
KillTimer(hwnd, ID_TIMER); // elimina el temporizador
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Ventana";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc)) return 0; // termina si no registra la clase
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
"Ventana",
"Simulación y visualización de una señal",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 340, 200,
NULL, LoadMenu(hInstance, "Menu"), hInstance, NULL);
InsertarMenu(hwnd);
if(hwnd == NULL) return 0; // termina si la ventana no se ha creado
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
void InsertarMenu(HWND hWnd)
{
HMENU hMenu1, hMenu2;
hMenu1 = CreateMenu();
hMenu2 = CreateMenu();
AppendMenu(hMenu2, MF_STRING, CM_Temperatura, "&Temperatura");
AppendMenu(hMenu2, MF_STRING, CM_Tacometro, "&Tacometro");
AppendMenu(hMenu2, MF_STRING, CM_Sensor_3, "Sensor &3");
AppendMenu(hMenu2, MF_STRING, CM_Sensor_4, "Sensor &4");
AppendMenu(hMenu2, MF_STRING, CM_Sensor_5, "Sensor &5");
AppendMenu(hMenu2, MF_SEPARATOR, 0, NULL);
AppendMenu(hMenu2, MF_STRING, CM_SALIR, "&Salir");
AppendMenu(hMenu1, MF_STRING | MF_POPUP, (UINT)hMenu2, "&Principal");
SetMenu (hWnd, hMenu1);
}
///////////////////////////////////////////////////////////////////////////////
BarraHorizontal.cpp
///////////////////////////////////////////////////////////////////////////////
#include "BarraHorizontal.h"
BarraHorizontal::BarraHorizontal()
{
hWnd = NULL;
nPos = 0;
}
void BarraHorizontal::CreaVentana(
int x, int y, int w, int h,
int inicio, int final,
int posInicial,
int id, HWND hwnd)
{
nPos = posInicial;
hWnd = CreateWindow("scrollbar", NULL,
WS_CHILD | WS_VISIBLE | SBS_HORZ,
x, y, w, h,
hwnd, (HMENU) id, NULL, NULL);
SetScrollRange(hWnd, SB_CTL, inicio, final, TRUE);
SetScrollPos(hWnd, SB_CTL, posInicial, TRUE);
}
int BarraHorizontal::Posicion()
{
return nPos;
}
void BarraHorizontal::Evento(WPARAM wParam)
{
switch(LOWORD(wParam))
{
case SB_PAGEDOWN: nPos = min(100, nPos + 10); break;
case SB_LINEDOWN: nPos = min(100, nPos + 1); break;
case SB_PAGEUP: nPos = max(0, nPos - 10); break;
case SB_LINEUP: nPos = max(0, nPos - 1); break;
case SB_TOP: nPos = 0; break;
case SB_BOTTOM: nPos = 100; break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK: nPos = HIWORD(wParam); break;
default: break;
}
SetScrollPos(hWnd, SB_CTL, nPos, TRUE);
}
///////////////////////////////////////////////////////////////////////////////
TextoEstatico.cpp
///////////////////////////////////////////////////////////////////////////////
TextoEstatico::TextoEstatico()
{
hWnd = NULL;
}
void TextoEstatico::CreaVentana(
int x, int y, int w, int h,
char* s,
int id, HWND hwnd)
{
hWnd = CreateWindow("static", s,
WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER,
x, y, w, h,
hwnd, (HMENU) id, NULL, NULL);
}
void TextoEstatico::Escribe(int n)
{
char s[32];
itoa(n, s, 10); // Convierte un entero en texto
SetWindowText(hWnd, s); // Despliega el nuevo valor
}
jeje espero no se les haga tedioso el programa :-P ;-)
Paul Andree Masias Chacon paulmasias en yahoo.es
Estudiante
Ing. Electrónica
UNSAAC - Cusco - Perú
9721594 - 260352
Más información sobre la lista de distribución Cconclase