Promación del puerto rs232 (serial)en borland c/c++

Super Alejo
29 de Enero del 2004
Necesito ayuda en cómo configurar una conexion en el puerto rs232 para programar el microprocesador de un robot (URGENTE)

asabogal
29 de Enero del 2004
Bueno super Alejo, me parece que tu pregunta no es muy clara, ademas el trabajo que puedashacer con el rs232 dependera de que version de borland tengas, pero te mostrare un codigo fuente que tengo para c++, igual te debe servir el borland, que hace uso de la funcion bioscom, basica para la comunicacion serial, el programa se puede ejecutar en dos maquinas conectadas por serial (rs232) y una puede enviar caracteres a la otra. Puede ser un punto de partida...

/* TRANSMISION SERIAL CON EL RS-232 */
/*Transmisi¢n y recepci¢n de datos */

#include <ctype.h>
#include <bios.h>
#include <conio.h>
#include <process.h>
#include <stdio.h>
/*#include <sysstab.h>*/
#include <string.h>
/*#include <fentl.h>
#include <lo.h>*/
#include <stdlib.h>
#include "dos.h"
/* DEFINICION DE CONSTANTES */

#define SI 1
#define NO 0
#define CR 0x0D
#define ESC 0x1B
#define hayDatos 0x100
#define LineaSimple "°°°°°"
#define Lineaforma "Ú¿ÀÙij"
#define LineaDoble "ɻȼͺ"
#define FondoPant

/* DEFINICION DE VARIABLES */

int contar;
int velocidad=96; /*600 baudios */
int paridad = 8; /*bit de paridad impar */
int bit_parada =4; /* Dos bits de parada */
int bits_caracter =2; /* Caracter de 7 bits */
int COM1= 0, num; /* puerto Com1 */
char setupRS;
int cual_byte, cual_bit;
int exp2, ascii,i,j,k,l,m,n,acum;
char vect[16], letra, vect1[15];
int code[10][15];

/* PROGRAMA PRINCIPAL */
int Enviar_datos();



/* LLAMADAS A LAS FUNCIONES */

void imprime_pantalla()
{
int i,j;
clrscr();
window(0,0,80,24);
textcolor(YELLOW);
textbackground(8);
for(i=0; i<25; i++)
{
gotoxy (0, i);
for (j=0;j<81;j++)
cprintf(" ");
}
}

int Dibuja_Pantalla (int izq, int inicio, int der, int fin, char * clase)
{
int i;

if((izq < der) && ( inicio < fin))
{
for(i = izq + 1; i < der; i++)
{
gotoxy (i, inicio);
putch (clase[4]);
gotoxy (i, fin);
putch(clase[4]);
}
for(i = inicio+1; i<fin; i++)
{
gotoxy (der,i);
putch(clase[5]);
gotoxy (izq, i);
putch(clase[5]);
}

gotoxy (izq, inicio); putch(clase[0]);
gotoxy (der, inicio); putch(clase[1]);
gotoxy (izq, fin); putch(clase[2]);
gotoxy (der, fin); putch(clase[3]);

return(1);


}
else return(0);
}

void Caratula(void)

{
/* Presenta en pantalla el titulo del trabajo y los nombres de los integrantes*/

clrscr();
imprime_pantalla();
Dibuja_Pantalla( 15,3,64,20, LineaSimple);
Dibuja_Pantalla( 15,21,64,23, LineaDoble);
gotoxy (19,5); cputs(" UNIVERSIDAD NACIONAL DE COLOMBIA ");
gotoxy (19,7); cputs(" SEDE MANIZALES ");
gotoxy (19,9); cputs(" ");
gotoxy (17,22); cputs(" TRANSMISION DE DATOS EN FORMA SERIAL (RS-232) ");
gotoxy (19,18);
textcolor(270);
cprintf(" presione cualquier tecla para continuar: ");
textcolor(YELLOW);

}



lea_opcion()

/* Presenta el men£ principal y devuelve la opci¢n que el usuario elija */
{
char tecla;
int continuar = SI;
clrscr();
Dibuja_Pantalla( 17,3,62,20, LineaSimple);
Dibuja_Pantalla( 15,21,64,23, LineaDoble);

gotoxy (17,22); cputs(" TRANSMISION DE DATOS EN FORMA SERIAL ");
gotoxy (22,7); cputs(" MENU PRINCIPAL ");
gotoxy (22,11); cputs(" 1.- Enviar datos ");
gotoxy (22,12); cputs(" 2.- Recibir datos ");
gotoxy (22,13); cputs(" ESC Salir del programa ");
gotoxy (22,16); cputs(" Digite su opcion "); gotoxy (46,16);
while (continuar)
{
tecla= getch();
if((tecla == '1') || (tecla=='2') || (tecla==ESC))
continuar=NO;
}
return(tecla);
}



int existeRS232 ()

/*Verifica si el RS232 est  conectada */

{
return((biosequip () & 0xE00)? 1: 0);
}

void Pantalla_Comunicacion (void)
{
clrscr();
imprime_pantalla();
Dibuja_Pantalla (1, 1, 79, 19, LineaDoble);
gotoxy(23,1); cputs("TRANSMISION SERIAL ");
Dibuja_Pantalla (4,2,76,8,LineaDoble);
gotoxy(32,2); cputs("TRANSMISION");
Dibuja_Pantalla (4,10, 76, 16,LineaDoble);
gotoxy(33,11); cputs("RECEPCION");
Dibuja_Pantalla (1,17, 64, 19,LineaDoble);
Dibuja_Pantalla (65,17, 79, 19,LineaDoble);
gotoxy(67,18); cputs("ESC: Salir");
}

con_error()
{
int op;
char tecla[1], aux[10];

/*gotoxy(4,18);cputs("DESEA ENVIAR EL MENSAJE CON ERROR ? S-1/N-0");
tecla[0]= getch();
randomize();
printf("%c",tecla[0]);*/
Dibuja_Pantalla (1,21, 79, 23,Lineaforma);
gotoxy(4,22);
cputs("Cuantas letras desea ingresar (1-80)Äį ");
scanf("%d",&contar);
gotoxy(4,22);
delay(500);
cputs(" ");


if(tecla[0]=='1' || tecla[0]=='s' || tecla[0]=='S')
{
gotoxy(4,22);
printf("En cual letra desea el error (1-%d) Äį ",contar);
scanf("%d",&cual_byte);
delay(500);
gotoxy(4,22);
cputs(" ");
gotoxy(4,22);
cputs("En cual bit desea el error (0-6)Äį ");
scanf("%d",&cual_bit);
delay(500);
gotoxy(4,22);
cputs(" ");
}
else
{
cual_byte=100;
cual_bit=100;
}
return 0;
}


void crc()
{
int k1;
m=7;

for(k=8; k<=14; k++)
{
acum=0;

for(l=1; l<=7; l++)
if(l!=m)
{
if(vect[l]=='1')
k1= 1;
else
k1=0;
acum=k1^ acum;
}
if(acum==1)
vect[k]='1';
else
vect[k]='0';
m--;
}
}



a_binario()
{
int ih= 1, res,ho=0;
con_error();
i=0;
num=0;
vect[0]= '0';
window(5,3, 75,8);
gotoxy(ih,1);
letra=getch();
while (ho!=contar)
{
ascii=toascii(letra);
j=7;
gotoxy(ih,1); putch(letra);
while(ascii>=2)
{
res= ascii%2;
if(res==1)
vect[j]='1';
else
vect[j]='0';

ascii=ascii/2;
j--;
}
if(ascii==1)
vect[j]='1';
else
vect[j]='0';

crc();
if(cual_byte==num)
{
if(vect[cual_bit]=='1')
vect[cual_bit]='0';
else
vect[cual_bit]='1';
}


Enviar_datos();
ih++;
gotoxy(ih,1);
num++;
letra=getch();
ho++;
}
window(1,1,80,25);
clrscr();
}



int Enviar_datos()
/* Permite realizar la tansmisi¢n de los datos */

{
int letra,ij;

for(ij=0; ij<=14; ij++)
{
letra= vect[ij];
bioscom(1, letra, COM1);
}
return(vect[ij]);
}


dos()
{
int i1;
exp2=1;

for(i1=1; i1<=n; i1++)
exp2= exp2 + 2;
return 0;
}


corregir()
{
char caracter;
int sw, acum,l1,i2,si=0;
int h[7][15]= {1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,
1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,
1,1,1,1,1,0,1,1,0,0,1,0,0,0,0,
1,1,1,1,0,1,1,1,0,0,0,1,0,0,0,
1,1,1,0,1,1,1,1,0,0,0,0,1,0,0,
1,1,0,1,1,1,1,1,0,0,0,0,0,1,0,
1,0,1,1,1,1,1,1,0,0,0,0,0,0,1,
};
int ceros[7] = {0,0,0,0,0,0,0};
int bin;
char tecla;

window (4,22,72,22);
gotoxy(4,22); printf("El mensaje es:");

for( i2=0; i2<=num; i2++)
{
for(m=0; m<=6; m++)
{
acum= (h[m][0] & code[12][0]);

for(n=1; n<=14; n++)
{
acum= acum ^ (h[m][n] & code[i2][n]);
}
ceros[m]= acum;
}
sw= 0;
for(m=0; m<=6; m++)
if(ceros[m]==1)
sw = 1;
if(sw==1)
{
si=1;
for(k=0; k<=7; k++)
{
if(ceros[0]== h[0][k])
{
for(l=1; l<=6; l++)

{
if(h[l][k]!=ceros [l])
break;
if((l-1)==6)
break;
}
}
}
}
if(code[i2][k]==1)
code[i2][k]=0;
else
code[i2][k]=1;
}
n=7;
acum= 0;

for(l1=0; l1<=7; l1++)
{
dos();
acum= acum + (code[i2][l1]+ exp2);
n--;
}
caracter= acum;
gotoxy(4,22); printf("%c",caracter);

/* window(5,12,75,17) ; */



if(si==1)
{
gotoxy(4,22); printf("El bit con error es: %d", k);
}

getch();
}


trans_dec()

{
int l1, acum, bin,auxiliar=0,aux2=1,ii;
char aux;
n=7;
acum= 0;
num++;

for(l1=0; l1<=14; l1++)
if(vect[l1]=='1')
code[num][l1]=1;
else
code[num][l1]=0;

for(l1=7; l1>=0; l1--)
{
/* dos();

if(vect[l1]=='1')
bin=1;
else
bin=0;
acum= acum + bin*exp2;
n--;*/

if (vect[l1]=='1')
for (ii=0;ii<auxiliar;ii++)
aux2=aux2*2;
else
aux2=0;
acum=acum+aux2;
auxiliar++;
aux2=1;
}
aux= acum;
gotoxy(4,18); printf("%c",aux);
return 0;
}


int Recibir_datos()

/*Permite realizar la recepci¢n de los datos */
{
int status, i=0, seguir= SI, COM1=0;
num= -1;
bioscom(2, 0, COM1);
window(5,12,75,17);
gotoxy(1,1);

while(seguir)
{
if(kbhit())
{
vect[i]= getch();

if(vect[i] ==27)
seguir=NO;
}

bioscom(1, vect[i], COM1);
status = bioscom (3, 0, COM1);
if(status & hayDatos)
switch(vect[i++]= bioscom(2, 0, COM1))
{
case ESC : seguir = NO; break;
default:
switch(vect[i])
{
//case SR: cputs ("n"); break;
case 'b': cputs ("bb"); break;
case 't': printf("t"); break;
default: {
if(i==15)
{
trans_dec();
// corregir();
i=0;
}
if( l==14)
l=1;
l++;
}
}
}
}

// corregir();
window(1,1,80,25);
clrscr();
return(vect[i]);
}

main()
{
char ch, opcion, tecla1;

Caratula ();
gotoxy(97,28);
ch= getch();
if(! existeRS232 ())
{
clrscr();
Dibuja_Pantalla(5,10,75,15,LineaDoble);
gotoxy (22,12);
cputs("ERROR: No existe un RS232 instalado");
ch= getch();
}

else
{
do
{
ch= lea_opcion();
switch(ch)
{
case'1':
{
setupRS = velocidad + paridad +bit_parada + bits_caracter;
bioscom (0, setupRS, COM1);
Pantalla_Comunicacion ();
a_binario ();
break;
}
case '2':
{
setupRS = velocidad + paridad +bit_parada + bits_caracter;
bioscom (0, setupRS, COM1);
Pantalla_Comunicacion ();
Recibir_datos ();
break;
}
}
}while (ch!= ESC);
}
clrscr();
return 0;
}