PDA

Ver la versión completa : Compatibilidad C con win XP



neko
04/09/2003, 19:40
Resulta que hace poco tenia el windows ME instalado y programé con visual C un programilla que realizase una comunicacion entre un microcontrolador y mi PC, cual fue mi sorpresa que al pasarme a XP el programa no funciona y me da un error de ejecucion. alguien sabe pq puede ser?, las direcciones de los puertos son distintas en XP que en ME?, si no recuerdo mal era la 378 en ME

neko
04/09/2003, 19:42
Perdon, se me paso decir que la comunicacion era por el puerto serie, creo en ME las direcciones son 278 para el COM2 y 378 para el COM1

kirichof
06/09/2003, 13:36
pues la verdad es que no tengo mucha idea de C (mucho menos de Visual C) y supongo que la pregunta ofende pero: has probado de recompilar el programa?

alex
06/09/2003, 14:09
La compatibilidad no esta entre C y Windows XP, es otra cosa. Resulta que en Windows NT/2000/XP los programas no pueden acceder al hardware directamente, es decir las instrucciones de C de outportb(...) que escriben en el espacio de direccionamiento de E/S (entrada/salida) no funcionan. Ah! Y olvidate de reemplazar un rutina de servicio de una interrupción etc... Deberás hacerlo a través de llamadas al S.Op., llamadas al driver correspondiente etc.
Si todo esto lo ves complicado también existen DLLs que simulan el acceso a los puertos y podrás usar instrucciones "parecidas" al outport.
Por otro lado tambien tienes VBasic q añadiendo el control del puerto serie a un formulario ya te permite realizar la comunicación a través de este puerto.

neko
06/09/2003, 14:50
Gracias por las respuestas. Si, si que lo habia copilado otra vez, pero en teoria no tendría pq ser eso. Por si alguno le interesa, este era el programilla que uso, = os aclara mas las ideas ;)

/************************************************** ***********************************************/
/* Comrs232.c */
/************************************************** ***********************************************/

#include <dos.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>

#define TIME_OUT 100 // en ms
#define TIEMPO_ESPERA 10000 // en ms

#define DIR_REG_BASE 0x2F8 // COM1 para usar el COM2 poner 0x2F8
#define LCR (unsigned short) (DIR_REG_BASE+3)
#define IER (unsigned short) (DIR_REG_BASE+1)
#define DLL (unsigned short) (DIR_REG_BASE+0)
#define DLM (unsigned short) (DIR_REG_BASE+1)
#define LSR (unsigned short) (DIR_REG_BASE+5)
#define RBR (unsigned short) (DIR_REG_BASE+0)
#define THR (unsigned short) (DIR_REG_BASE+0)

// Mascara de LSR

#define DR 1
#define OE 2
#define PE 4
#define FE 8
#define DR 1
#define BI 0x10
#define THRE 0x20

// Prototipo de funciones

int IniciarPuerto(unsigned char dlm,unsigned char dll,unsigned char lcr);
void RecibirCaracter(unsigned char *c);

void main (void)
{
int i;
unsigned char Datos[140];
unsigned char CaracterRecibido;
FILE* puntfich;
char* nomfich="temperatura";
char* nomfich2="velocidades";
// Iniciar puerto
printf("\n ESTACION METEOROLOGICA");
printf("\n Programa receptor de datos via RS232");
printf("\n Se va a iniciar el puerto");
//DLM : 0 0 0 0 0 0 0 0
//DLL : 0 0 0 0 1 1 0 0
//LCR : 1 0 0 0 0 0 1 1 //DLAB=1; 8 bits; 1 bit stop; sin paridad
IniciarPuerto(0,12,0x83);
printf("\n Puerto inicializado (9.600 bps; 8 bits; 1 bit stop ; sin paridad)");
printf("\n Esperando conexion...");
for (i=0; i<140; i++)
{
RecibirCaracter (&CaracterRecibido);
Datos[i]=CaracterRecibido;
}


//Volcado a un fichero los datos de temperatura

if((puntfich=fopen(nomfich,"wb"))!=(FILE*)NULL)
{
for(i=0;i<70;i=i+2)
{
fwrite(&Datos[i],sizeof(unsigned char),1,puntfich);
}
fclose(puntfich);
}
if((puntfich=fopen(nomfich2,"wb"))!=(FILE*)NULL)
{
for(i=1;i<70;i=i+2)
{
fwrite(&Datos[i],sizeof(unsigned char),1,puntfich);
}
fclose(puntfich);
}
printf("\n Proceso finalizado, archivos resultantes de la operacion:");
printf("\n - temperatura");
printf("\n - velocidades");
printf("\n\n\n Pulse una tecla para salir del programa");
getch();
for(i=0; i<140; i++)
{
printf("%c",Datos[i]);
}
}


int IniciarPuerto (unsigned char dlm, unsigned char dll, unsigned char lcr)
{
_outp (LCR,lcr|0x80); //lcr + DLAB A 1
_outp (DLM,dlm);
_outp (DLL,dll);

_outp (LCR, lcr & 0x7F); // DLAB A 0
_outp (IER, 0);

return 0;
}

void RecibirCaracter (unsigned char *c)
{
int RegistroLSR;

do
{
//leemoes el registro LSR
RegistroLSR=_inp (LSR);
}
while (!(RegistroLSR & DR));

*c=(unsigned char) _inp (RBR);
}

//este programa en principio recibe una serie de datos de un PIC (microcontrolador), y los almacena en 2 ficheros de datos para su posterior procesado