Ver Mensaje Individual
  #9 (permalink)  
Antiguo 30/11/2015, 02:38
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Establecer comunicacion usb serial

Cita:
Iniciado por pedrobarreno010 Ver Mensaje
Ahora bien siguiendo el ejemplo que me mostraste "SerialPortExample" debo decir que no me recnoce en windows la libreria termios.h cual podria utilizar en ese caso?
termios.h es propia del entorno Linux y no hay un sustituto "tal cual" en Windows, que imagino será tu caso.

En cualquier caso, si ya tienes el puerto serie reconocido como COM1 la comunicación la puedes realizar (o deberías poder realizarla) de forma directa.

Lo primero es abrir el puerto. En windows el puerto serie se gestiona como un fichero... tiene sus particularidades con respecto a un fichero de verdad (las opciones de seek no tienen ningún efecto, por ejemplo) pero su uso es básicamente el mismo.

Para empezar hay que abrir el fichero:

Código C:
Ver original
  1. HANDLE hSerial;
  2. hSerial = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

Lo básico a saber de esas líneas es que abres el fichero "COM1" con acceso de lectura y escritura... y que el fichero ha de existir, para una documentación más precisa consulta la MSDN.

Después estaría bien verificar que hemos podido abrir el puerto:
Código C:
Ver original
  1. if ( INVALID_HANDLE_VALUE == hSerial )
  2. {
  3.   printf("No se ha podido abrir el puerto.\n");
  4.   if (GetLastError() == ERROR_FILE_NOT_FOUND)
  5.     printf("\tNo existe el puerto serie.\n");
  6. }

El siguiente paso sería configurar el puerto serie. En este caso lo mejor es leer la configuración actual y sobreescribir los parámetros que necesitemos...

Código C:
Ver original
  1. COMMCONFIG dcbSerialParams;
  2. if (!GetCommState(hSerial, &dcbSerialParams.dcb))
  3. {
  4.   printf("No ha sido posible leer la configuración del puerto\n");
  5. }
  6.  
  7. dcbSerialParams.dcb.DCBlength = sizeof(dcbSerialParams.dcb);
  8.  
  9. dcbSerialParams.dcb.BaudRate = CBR_9600; // Velocidad de conexión
  10. dcbSerialParams.dcb.ByteSize = 8; // Tamaño del byte
  11. dcbSerialParams.dcb.StopBits = ONESTOPBIT; // Bits de stop
  12. dcbSerialParams.dcb.Parity = NOPARITY; // Paridad
  13.  
  14. dcbSerialParams.dcb.fBinary = TRUE;
  15.  
  16. // Sin control de ningún tipo
  17. dcbSerialParams.dcb.fDtrControl = DTR_CONTROL_DISABLE;
  18. dcbSerialParams.dcb.fRtsControl = RTS_CONTROL_DISABLE;
  19. dcbSerialParams.dcb.fOutxCtsFlow = FALSE;
  20. dcbSerialParams.dcb.fOutxDsrFlow = FALSE;
  21. dcbSerialParams.dcb.fDsrSensitivity= FALSE;
  22. dcbSerialParams.dcb.fAbortOnError = TRUE;
  23.  
  24. if (!SetCommState(hSerial, &dcbSerialParams.dcb))
  25. {
  26.     printf("No ha sido posible configurar el puerto\n");
  27. }


Y si no se me olvida nada, ya está... ya puedes leer y escribir del puerto a placer:

Escribir:
Código C:
Ver original
  1. char* toSend = "Datos a enviar";
  2. int nToSend = strlen(toSend );
  3. DWORD bytesWritten = 0;
  4.  
  5. if (!WriteFile(hSerial, toSend, nToSend, &bytesWritten , NULL))
  6. {
  7.   printf("Error de escritura\n");
  8. }

Leer:
Código C:
Ver original
  1. char buffer[200];
  2. DWORD bytesRead = 0;
  3. int nToRead = strlen(buffer);
  4.  
  5. if (!ReadFile(hSerial, buffer, nToRead, &bytesRead, NULL))
  6. {
  7.   printf("error de lectura\n");
  8. }

Y claro, cuando terminemos sólo falta cerrar el puerto:

Código C:
Ver original
  1. CloseHandle(hSerial);

y ya está. Si no me he olvidado de nada con esto ya tendrías todo lo necesario para leer y escribir de tu flamante nuevo puerto serie.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.