Sábado 14 de Diciembre de 2024, 19:46
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
»
Visual C++
(Moderador:
Eternal Idol
) »
ón
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: ón (Leído 2987 veces)
blasata
Miembro activo
Mensajes: 32
ón
«
en:
Sábado 28 de Noviembre de 2009, 13:13 »
0
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
Tweet
rfog
Miembro MUY activo
Mensajes: 166
Re: ón
«
Respuesta #1 en:
Sábado 28 de Noviembre de 2009, 13:40 »
0
¿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...
Microsoft Visual C++ MVP - Mi blog sobre programación:
http://geeks.ms/blogs/rfog
blasata
Miembro activo
Mensajes: 32
Re: ón
«
Respuesta #2 en:
Domingo 29 de Noviembre de 2009, 14:42 »
0
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?
rfog
Miembro MUY activo
Mensajes: 166
Re: ón
«
Respuesta #3 en:
Domingo 29 de Noviembre de 2009, 15:16 »
0
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.
Microsoft Visual C++ MVP - Mi blog sobre programación:
http://geeks.ms/blogs/rfog
blasata
Miembro activo
Mensajes: 32
Re: ón
«
Respuesta #4 en:
Domingo 29 de Noviembre de 2009, 18:51 »
0
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
rfog
Miembro MUY activo
Mensajes: 166
Re: ón
«
Respuesta #5 en:
Lunes 30 de Noviembre de 2009, 12:12 »
0
Pon el "COM1" también rodeado con la macro _T.
Para ajustar los timeouts y retardos del puerto, tienes la función SetCommTimeouts()
http://msdn.microsoft.com/en-us/library/aa363437(VS.85
).aspx
Y dependiendo de la velocidad y de lo precisa que sea la placa que estés usando, el conversor RS232 a USB te funcionará o no. También depende del chip que tenga el conversor.
De todos modos, venden placas PCI y PCIe con puertos serie reales. Las hay hasta de 256 puertos, aunque lo habitual es 2 serie y uno paralelo.
Microsoft Visual C++ MVP - Mi blog sobre programación:
http://geeks.ms/blogs/rfog
blasata
Miembro activo
Mensajes: 32
Re: ón
«
Respuesta #6 en:
Lunes 30 de Noviembre de 2009, 13:43 »
0
_T hecho.
La plaquita es de reles, lleva un chip usb-i2c de ftdi. Y ya está funcionando bien.
Podría haber hecho el control de reles por pparalelo pero ya voy a meter un LCD y las entradas digitales de esa forma y solo tengo dos puertos de este tipo.
Pero ahora he estado leyendo que WXP no deja acceder fácil a este puerto y que hay que usar io.dll o algo así:
¿Se puede seguir usando con este puerto CreateFile?¿valen los mismos parámetros?
h=CreateFileW(_T("LPT1"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
¿O pueden servir las funciones int_outp int_inp?
rfog
Miembro MUY activo
Mensajes: 166
Re: ón
«
Respuesta #7 en:
Lunes 30 de Noviembre de 2009, 13:50 »
0
Los parámetros no sé si son correctos o no, creo que sí, y claro que se puede abrir así el puerto paralelo. Es la forma oficial de hacerlo.
Microsoft Visual C++ MVP - Mi blog sobre programación:
http://geeks.ms/blogs/rfog
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
»
Visual C++
(Moderador:
Eternal Idol
) »
ón