Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Para usar ReadFile() con windowsXP he de esperar una eternidad desde que se escribe el dato ¡nada menos que 250ms! si pongo menos no pillo nada.
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE
hCom1=CreateFile("COM3",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0),
hCom2=CreateFile("COM4",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if (!SetCommTimeouts(hCom1, &timeouts)) { printf("nError timeout puerto-1 con error: %d", GetLastError());getchar();getchar(); return-1;}
if (!SetCommTimeouts(hCom2, &timeouts)) { printf("nError timeout puerto-2 con error: %d", GetLastError());getchar();getchar(); return-1;}
SetupComm(hCom1,4048,4048);
SetupComm(hCom2,4048,4048);
DCB dcb;
ZeroMemory(&dcb,sizeof(dcb));
dcb.DCBlength=sizeof(dcb);
dcb.BaudRate = CBR_57600; // baud rate
dcb.ByteSize = 8; // data size, xmit and rcv
dcb.Parity = NOPARITY; // parity bit
dcb.StopBits = ONESTOPBIT; // stop bit
if (SetCommState(hCom1,&dcb)) printf("nAbierto puerto-1");
else { printf ("nFalla SetCommState en puerto-1 con error: %d", GetLastError());getchar();getchar(); return-1;}
if (SetCommState(hCom2,&dcb)) printf("nAbierto puerto-2");
else { printf ("nFalla SetCommState en puerto-2 con error: %d", GetLastError());getchar();getchar(); return-1;}
DWORD res;
char dato2[4048];
WriteFile(hCom1,"Hey, RS232!",11,&res,NULL);
printf("nEnviados %li bytes y espero 0ms ",res); Sleep(0);
ReadFile( hCom2,dato2,11,&res,NULL);
printf("Recibidos %li bytes",res);
WriteFile(hCom1,"Hey, RS232!",11,&res,NULL);
printf("nEnviados %li bytes y espero 5ms ",res); Sleep(5);
ReadFile( hCom2,dato2,11,&res,NULL);
printf("Recibidos %li bytes",res);
WriteFile(hCom1,"Hey, RS232!",11,&res,NULL);
printf("nEnviados %li bytes y espero 50ms ",res); Sleep(50);
ReadFile( hCom2,dato2,11,&res,NULL);
printf("Recibidos %li bytes",res);
WriteFile(hCom1,"Hey, RS232!",11,&res,NULL);
printf("nEnviados %li bytes y espero 100ms ",res); Sleep(100);
ReadFile( hCom2,dato2,11,&res,NULL);
printf("Recibidos %li bytes",res);
WriteFile(hCom1,"Hey, RS232!",11,&res,NULL);
printf("nEnviados %li bytes y espero 200ms ",res); Sleep(200);
ReadFile( hCom2,dato2,11,&res,NULL);
printf("Recibidos %li bytes",res);
WriteFile(hCom1,"Hey, RS232!",11,&res,NULL);
printf("nEnviados %li bytes y espero 500ms ",res); Sleep(500);
ReadFile( hCom2,dato2,11,&res,NULL);
printf("Recibidos %li bytes",res);
CloseHandle(hCom1);
CloseHandle(hCom2);
printf("n===FIN===");
getchar();
getchar();
return 0;
}
Puedo también poner al principio, pero el efecto también es convertir el puerto en una cosa super lenta
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 250; //250ms Windows!!!!!!!
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;
if (!SetCommTimeouts(hCom1, &timeouts)) { printf("nError timeout puerto-1 con error: %d", GetLastError());getchar();getchar(); return-1;}
if (!SetCommTimeouts(hCom2, &timeouts)) { printf("nError timeout puerto-2 con error: %d", GetLastError());getchar();getchar(); return-1;}
¿como lo soluciono?
OK, era un tema de cables, con 10cms puedo trasmitir aun subedo a 1228800 baudios