[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