Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
¡Hola compañeros!
Ando metido en mil proyectos diferentes, pero el que mas me importa ahora mismo esta detenido por una tonteria que se me escapa... asi que ire al grano.
Alguien sabe como mandar datos via serie (Com1) bajo Borland 6.0 en C++?
Siempre he usado VB y nunca he tenido problemas gracias a MScomm, pero aqui no solo no esta, sino que no estoy seguro de si funcionaria bajo XP... el caso es... alguien sabe como hacerlo?
Milloooooones de gracias... espero poder recompensaros pronto con un programita ameno y video guapis.
isotopo, muy buena página la de "c++ con clase", me va a venir muy bién para actualizarme que estoy un poco anticuado.
Otra página interesante con recursos para programadores:
http://www.programmersheaven.com/
Hola a todos
Igual llego tarde, pero ahi va un ejemplo mio, en el que se puede modificar por soft la configuración del puerto, en mi caso la leo del registro de Windows.
COMMTIMEOUTS ctmo;
int baud;
DCB dcb;
DWORD Paramcomm;
HANDLE hCom;
String Cadena = "9600,n,8,1";
String PuertoComm = "COM2";
TRegistry *Reg = new TRegistry;
Reg->RootKey = HKEY_CURRENT_USER;
if(Reg->OpenKey("\Software\EVENTRONIC",true))
{
if(Reg->ValueExists("Puerto Comm"))
PuertoComm = Reg->ReadString("Puerto Comm");
if(Reg->ValueExists("Cadena"))
Cadena = Reg->ReadString("Cadena");
if(Reg->ValueExists("Retardo"))
RET = Reg->ReadInteger("Retardo");
if(Reg->ValueExists("Intervalo"))
Intervalo = Reg->ReadInteger("Intervalo");
}
Reg->CloseKey();
delete Reg;
FillMemory(&dcb,sizeof(dcb),0);
dcb.DCBlength = sizeof(dcb);
if(!BuildCommDCB(Cadena.c_str(),&dcb))
{
MessageBox(Handle,"Parámetros puerto serie incorrectos","Error",MB_ICONHAND);
PuertoOk = false;
}
else
PuertoOk = true;
hCom = CreateFile(PuertoComm.c_str(),GENERIC_READ |GENERIC_WRITE,
0,0,OPEN_EXISTING,
0,0);
if(hCom == INVALID_HANDLE_VALUE )
{
MessageBox(NULL,"Error abriendo puerto COMM","Error",MB_ICONHAND);
PuertoOk = FALSE;
}
memset(&ctmo,0,sizeof(ctmo));
if(PuertoOk)
{
ctmo.ReadIntervalTimeout = 65535;//(10000/baud)+2; //Tiempo de espera entre bytes rx
ctmo.ReadTotalTimeoutMultiplier = 2; //Tiempo de espera total es este valor*nºbytes
ctmo.ReadTotalTimeoutConstant = 5; // tiempo de espera adicional
ctmo.WriteTotalTimeoutMultiplier = 2;
ctmo.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hCom, &ctmo);
SetCommState(hCom, &dcb);
}
luego se lee con ReadFile(hCom,buffer,1,&nBytes,NULL);//lee un carácter
para escribir un carácter: TransmitCommChar(hCom, 'c');
limpieza del buffer de RX: PurgeComm(hCom,PURGE_RXCLEAR);
y el de TX PurgeComm(hCom,PURGE_TXCLEAR);
Saludos
Retomo este hilo... de hace ya un tiempo, porque estoy haciendo de nuevo los programas de comunicacion para TupperBot... y claro... lo primero de lo que me he dado cuenta es que puedo hacer un programa super guapo en el Robot, que maneje todo e informe de todo sin problemas, pero en el PC me encuentro que necesito tener eventos en el puerto serie...
Que tonteria... con lo facil que es en un pic...
El caso es que... dentro de mi ignorancia... he revisado todos los ejemplos que tenemos en este hilo, y el unico que veo con eventos es el de SinicK, ¿no?
De momento acabo de empezar con ello, ya os informare de mis avances... a ver si consigo entenderlo yo tanto como para poder explicarlo despues...
Hola Mif
Eventos del estilo del pic (mediante una interrupción de hardware) no creo que existan bajo Win32 en alto nivel. Lo que se hace es hacer lecturas contínuas del puerto, bien mediante un temporizador (como hago yo) o bien mediante un hilo de aplicación (thread o tarea) como el ejemplo de SinicK. Ambos casos son válidos y funcionan sin problemas, ya que el buffer del puerto es lo suficientemente grande como para que lo puedas consultar cada x tiempo sin perder datos (yo lo suelo hacer cada 100 milisegundos)
Salu2