Programación General > Visual C++

 ón

(1/2) > >>

blasata:
Hola a todos, espero por favor puedan ayudar, estoy recién llegado a VC++ y estoy un poco perdido:
tengo una aplicación de consola, la estoy haciendo con VC++ 2008 Express(aunque es un poco matar moscas a cañonazos) y trucada para que pueda compilar los proyectos con MFC. El problema es que no sé acceder al puerto serie y he usado el siguiente código para acceder al él:

#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <math.h>
#include <bios.h>

int puerto,k,j,dato,config;
char lectura[1],dato1[2];

char leer()
  {
  do{
    dato=bioscom(2,0x83,puerto);
    } while (!kbhit());
  return(dato);
  }

void main(void)
  {
  clrscr();
  printf("Ingrese puerto COM a usar: ");
  scanf("%d", &puerto);
  while(puerto<1 || puerto>4)
    {
    clrscr();
    printf("ERROR... Debe ingresar 1, 2, 3 o 4 !!!nn");
    printf("Ingrese puerto COM a usar: ");
    scanf("%d", &puerto);
    }

  puerto--;
  config=0x83;
  bioscom(0,config,puerto);

  clrscr();
  gotoxy(14,4);
  printf("RECEPCION DE DATOS VIA SERIE");
  gotoxy(8,6);
  printf("Config --> COM %d \ 1200 bps \ 8N1", puerto+1);
  gotoxy(29,8);
  printf("Escape --> Salir");
  gotoxy(23,10);
  printf("MONITOR DE RECEPCION: ");

  do{
    if(!kbhit()) dato1[0]=leer();
    if(!kbhit())
      {
      gotoxy(40,12);
      printf("%1s ",dato1);
      }

    }while(!kbhit());

  }

Pero no lo puedo compilar en mi proyecto main.cpp, por eso lo he compilado con TurboC y lo que quiero es llamarlo desde mi aplicación de VC++ que es también de consola. He probado con system, pero se queda sin hacer nada.
¿cómo podría acceder al puerto serie desde esta aplicación de consola de VC++2008 sin usar programas externos?
¿Sería mejor hacer una aplicación de Forms y llamar desde esta a un programa de consola.?

gracias de antemano
saludos

rfog:
¿Te está enseñando algún profe? Si es así, cambia inmediatamente de centro.

Para leer/escribir en puerto serie desde Win32 se hace con CreateFile para abrir el puerto, WriteFile y ReadFile para escribir y leer. Mira la documentación de Visual C++ 2008...

blasata:
Vale, he usado este código para acceder al puerto:

HANDLE h; /* handler, sera el descriptor del puerto */
   DCB dcb; /*  estructura de configuracion */
   DWORD dwEventMask; /* mascara de eventos */
   
   /* abrimos el puerto */
   h=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
   
   if(h == INVALID_HANDLE_VALUE) {
      /* ocurrio un error al intentar abrir el puerto */
   }
   
   /* obtenemos la configuracion actual */
   if(!GetCommState(h, &dcb)) {
      /* error: no se puede obtener la configuracion */
   }
   
   /* Configuramos el puerto */
   dcb.BaudRate = 9600;
   dcb.ByteSize = 8;
   dcb.Parity = NOPARITY;
   dcb.StopBits = ONESTOPBIT;
   dcb.fBinary = TRUE;
   dcb.fParity = TRUE;
   
   /* Establecemos la nueva configuracion */
   if(!SetCommState(h, &dcb)) {
      /* Error al configurar el puerto */
   }
   
   /* Para que WaitCommEvent espere el evento RXCHAR */
   #
   SetCommMask(h, EV_RXCHAR);
   
   while(1) {
   DWORD n;
   char enviar;
   char recibido;
   /* Enviamos... */
   enviar = 'f';
   if(!WriteFile(h, &enviar/*puntero al buffer*/, 1/* 1 byte*/, &n, NULL)){
      /* Error al enviar */
   }
...
pero daba error:

error C2664: 'CreateFileW' : no se puede convertir el parámetro 1 de 'const char [5]' a 'LPCWSTR'

al generar la solución, así que he deshabilitado en propiedades-->general-->juego de caracteres: lo cambio de Utilizar juego de caracteres Unicode  a  Sin definir.
Así compila bien. Pero..
¿Se puede hacer que el código compile sin hacer esto de deshabilitar el Unicode o da igual?
¿Esto es recomendable?  :comp:

rfog:
A partir de Windows XP el juego de caracteres por defecto es Unicode, antes era ANSI.

Cuando compilas con el otro, estás forzando a windows a traducir internamente uno por otro, así que podrías volver a ponerlo en Unicode y declarar tus variables agnósticas en cuanto a charset:

TCHAR miCadena[];

en lugar de

char miCadena[];

const TCHAR *pChar=_T("Hola mundo");

en lugar de

const char *pChar="Hola mundo";

De ese modo las cadenas mutarán en UNICODE o en ANSI según el juego de caracteres que uses en tiempo de compilación en lugar de en tiempo de ejecución, y encima tu aplicación será portable.

blasata:
Bien, he cambiado las definiciones de char a TCHAR como dices, y también he puesto "COM1" del primer parámetro de CreateFile a L"COM1" porque me seguía diciendo que

error C2664: 'CreateFileW' : no se puede convertir el parámetro 1 de 'const char [5]' a 'LPCWSTR'

voy a conectar el PC con la plaquita a ver si le manda los comandos como dios manda. Espero no tener problema aunque tenga un puerto serie virtual...
gracias :beer:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa