fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Problema con window...
 
Avisos
Vaciar todo

Problema con windows y puerto serie:

6 Respuestas
2 Usuarios
0 Me gustas
5,607 Visitas
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

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?

Responder
5 respuestas
sistemasorp
Respuestas: 478
(@sistemasorp)
Ardero
Registrado: hace 14 años

¿Por qué no usas ReadFileEx para hacer una llamada asíncrona? http://msdn.microsoft.com/en-us/library/windows/desktop/aa365468(v=vs.85).aspx

Responder
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

No me gusta el sistema microsoft: si algo no funciona le meto una montaña de código a ver si se arregla.
ndagando por la vía que me has dicho me he encontrado con la sorpresa de que alguien dice que la culpa es del driver del convertidor usb a rs232, el caso es que tengo el mismo problema en C++ que en labview lo cual puede ser o por culpa del driver, del hardware o que usan la misma función. Uso un convertidor ftdi y acabo de actualizar el driver, como dispongo de un puerto serie en mi ordenador pronto saldré de dudas...

Responder
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

Confirmado, he usado el COM1 del ordenador y vá mucho más rápido.
También vá si pongo FTDI RS232 con otro igual. Sin embargo no me funciona cuando uso un convertidor FTDI de USB a RS232 con niveles TTL y con 4m de cable, aunque he bajado a 9600 baudios y sigue fallando.
A ver si con cables muy cortos vá bien y le pongo un prolongador USB para meter el convertidor USB-RS232 ttl en la placa. (hay integrados que pasan de TTL a RS232 PERO necesitan alimentaciones variadas o tienen un montón de patas)

Responder
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

OK, era un tema de cables, con 10cms puedo trasmitir aun subedo a 614400 baudios

Responder
Página 1 / 2
Compartir: