Professional Documents
Culture Documents
2. Programacin RS-232 en C
2.1. Objetivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Ejemplos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
Programacin RS-232 en C
2.1.
Objetivos.
El sistema operativo Windows tiene la librera para la programacin del puerto serie RS232. Para utilizar dicha librera hay que incluir en los programas en C el fichero de cabecera
windows.h mediante la directiva de preprocesamiento #include. La librera que se va a
utilizar en prcticas es la librera serie (serie.h). Est basada en las funciones originales de
windows.h. Al final de la prctica el alumno debe ser capaz de:
2.2.
|3|
4. Cerrar un puerto serie: Liberar un puerto. Es muy importante terminar los programas
implementados correctamente, ya que es necesario liberar el puerto para que otra
aplicacin lo capture de nuevo.
A continuacin se detallar el funcionamiento de las funciones.
2.2.1.
Funcin OpenSerialPort.
|4|
2.2.2.
Funcin SerialSendByte.
|5|
La idea consiste en que, dado que un float tiene sizeof(float) bytes (usualmente 4 bytes),
se utiliza un puntero de tipo BYTE que permite enviar byte a byte los bits del float. Entonces,
en el ejemplo, para enviar un float se utiliza el puntero v (de tipo BYTE) que apunta al float,
y posteriormente se enva el float como 4 (sizeof(float)) envos de 1 byte utilizando el puntero
v (ver bucle en el ejemplo).
2.2.3.
Funcin SerialReceiveByte.
2.3. Ejemplos.
|6|
2.2.4.
Funcin CloseSerialPort.
2.3.
Ejemplos.
Todos los ejemplos mostrados utilizan un esquema basado en la arquitectura Cliente/Servidor. Constan de un programa que es el cliente (cliente.cpp) y otro programa servidor
(servidor.cpp). El programa cliente enviar una peticin al cliente, y ste la realizar y devolver un resultado al cliente si se le debe devolver algo.
2.3.1.
2.3. Ejemplos.
Programa Cliente
#include "serie.h"
#include "windows.h"
#include "stdio.h"
int main(){
HANDLE hPort;
BOOL bRes, timeout=FALSE;
BYTE opc, *v;
int i;
float f;
// Se leera una zona como un grupo de 4 (sizeof(float)) bytes
// o como float, segun interese
v = (BYTE *) &f;
hPort=OpenSerialPort("COM8",CBR_9600,8,NOPARITY,ONESTOPBIT,0);
if (hPort==INVALID_HANDLE_VALUE) {
printf("Error abriendo puerto COM8");
return 1;
}
while(opc!=0){
printf("0) Salir\n");
printf("1) Incrementar real\n");
printf("2) Decrementar real\n");
scanf("%c", &opc);getchar();
if (opc==0) {
// envio de peticion de servicio
bRes = SerialSendByte(hPort,opc);
} else {
if ((opc==1) || (opc==2)) {
// envio de peticion de servicio
bRes = SerialSendByte(hPort,opc);
// lectura de resultado
// Realiza el bucle tantas veces como bytes tiene un float
for(i=0; i<(int)sizeof(float); i++) {
bRes = SerialReceiveByte(hPort,&v[i],&timeout);
}
printf("Valor variable float = %f\n", f);
// error en recepcion
if (!bRes) {
printf("Error leyendo de puerto com3");
CloseSerialPort(hPort);
return 1;
}
}
} // fin del else
} // fin del while
CloseSerialPort(hPort);// MUY IMPORTANTE: cerrar el puerto
return 0;
}
|7|
2.3. Ejemplos.
Programa Servidor
#include "serie.h"
#include "windows.h"
#include "stdio.h"
int main(){
HANDLE hPort, timeout = FALSE;
BOOL bRes;
BYTE byte = a, *v;
int i;
float valor;
// Se leera una zona como un grupo de 4 (sizeof(float)) bytes
// o como float, segun interese
v = (BYTE *) &valor;
hPort=OpenSerialPort("COM9",CBR_9600,8,NOPARITY,ONESTOPBIT,0);
if (hPort==INVALID_HANDLE_VALUE) {
printf("Error abriendo puerto COM9");
return 1;
}
valor = 0;
printf("SERVIDOR DE MANEJO DE FLOAT\n");
while (byte!=0) {
// lectura de servicio
bRes = SerialReceiveByte(hPort,&byte,&timeout);
if ((byte==1) || (byte==2)) {
printf("Peticion de servicio %c. ", byte);
// realizacion de accion
switch(byte) {
case 1:
valor = valor + 0.1;
break;
case 2:
valor = valor - 0.1;
break;
}
printf("Valor variable float = %f\n", valor);
for(i=0; i<(int)sizeof(float); i++) {
bRes=SerialSendByte(hPort,v[i]);
}
if (!bRes) {
printf("Error escribiendo en puerto COM1");
// MUY IMPORTANTE: cerrar el puerto
CloseSerialPort(hPort);
return 1;
}
} // fin del if ((byte==1)...
} // fin del while
CloseSerialPort(hPort);// MUY IMPORTANTE: cerrar el puerto
}
|8|
2.3. Ejemplos.
2.3.2.
|9|
2.3. Ejemplos.
|10|
Respecto a las respuestas del servidor en base a la peticin pedida el servidor slo debe
responder a 2 de las 7 peticiones. En la peticin 6 devuelve un float al cliente que es el valor
del atributo result de la estructura, mientras que en la peticin 7 devuelve la estructura
completa.
Programa Cliente
#include "serie.h"
#include "windows.h"
#include "stdio.h"
struct operadores {
int a;
int b;
float result;
};
int main(){
HANDLE hPort;
BOOL bRes, timeout=FALSE;
int i, vector[2]; // servicio en posicion 0 y parametro en posicion 1
BYTE *v, *r;
float f;
struct operadores estruc;
v = (BYTE *) vector; // v lee y escribe el vector de byte en byte
hPort=OpenSerialPort("COM8",CBR_9600,8,NOPARITY,ONESTOPBIT,5000);
if (hPort==INVALID_HANDLE_VALUE) {
printf("Error abriendo puerto COM8");
return 1;
}
vector[0] = -1; // distinto de 0
printf("CLIENTE\n");
while(vector[0]!=0){
printf("\n0) Salir\n")
printf("1) Asignar A\n");
printf("2) Asignar B\n");
printf("3) Minimo\n");
printf("4) Maximo\n");
printf("5) Media\n");
printf("6) Recibir float resultado\n");
printf("7) Recibir struct completo\n");
vector[1] = -1; // no parametro
// Leer peticion en v[0]
scanf("%d", &vector[0]);getchar();
if ((vector[0]>=0) && (vector[0]<=7)) {
if ( (vector[0]==1) || (vector[0]==2) ) {
printf("Dame el parametro\n");
scanf("%d",&(vector[1]));getchar();
}
printf("Valor peticion = %d, %d\n", vector[0], vector[1]);
// envio de peticion de servicio
2.3. Ejemplos.
|11|
"serie.h"
"windows.h"
"stdio.h"
"estruct.h"
int main(){
HANDLE hPort;
BOOL bRes, timeout = FALSE;
int i, vector[2];
BYTE *v, *r;
float f;
struct operadores estruc;
v = (BYTE *) vector; // v lee y escribe el vector de byte en byte
hPort=OpenSerialPort("COM9",CBR_9600,8,NOPARITY,ONESTOPBIT,timeout);
if (hPort==INVALID_HANDLE_VALUE) {
2.3. Ejemplos.
|12|
2.3. Ejemplos.
return 1;
}
} // fin del if ((vector[0]>=0) ...
} // fin del while
// MUY IMPORTANTE: cerrar el puerto
CloseSerialPort(hPort);
}
|13|