 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
A|e-X Cdt

Registrado: 29 Nov 2006Mensajes: 1
|
Publicado: Mie 29 Nov, 2006 10:40 am Asunto: Desbordamiento puerto serie |
|
|
Hola a todos. Soy nuevo en c++ builder así que perdonad si me expreso confusamente sobre el siguiente tema. Agracezco vuestra paciencia de antemano.
Estoy realizado una aplicación a través del puerto serie que usa un fichero CommThread_Unit.cpp que no creado yo. Este fichero es el que lleva a cabo la transferencia de información por el puerto serie. El problema consiste en que la aplicación falla de manera impredecible, es decir, llega un momento que el envío de datos a través del puerto colapsa el programa.
La explicación que yo le doy es que la variable de entrada en el puerto (el buffer) se llena sin que dé tiempo a transmitir su contenido, pero esta explicación es bastante sencilla e intuitiva debido a mi poca experiencia como programados c++ builder. Por ello recurro a vosotros para saber que podeis decirme. GRACIAS.
CÓDIGO FICHERO QUE REALIZA LA INTERFAZ:
void __fastcall TPrincipal::FormCreate(TObject *Sender)
{
Serial = new TCommThread();
Serial->ReturnMethod=ReturnMethod;
AdjustDevicesNames(
Serial->GetAvailableDevicesNames(true,false,NULL));
AdjustInterface();
Receive_Memo->Clear();
}
void TPrincipal::ReturnMethod(unsigned char *Buffer_Rx,unsigned long NDatos)
{
unsigned char i;
for(i=0;i<NDatos;i++)
{
Receive_Memo->Text=Receive_Memo->Text+
" "+((Format("%2.x",ARRAYOFCONST(((int)Buffer_Rx[i])))));
}
Receive_Memo->Lines->Add("");
}
FICHERO PUERTO SERIE CommThread_Unit.cpp
__fastcall TCommThread::TCommThread
(void(__closure *NewReturnMethod)(unsigned char *Buffer_Rx,unsigned long NDatos))
: TThread(true),ReturnMethod(NewReturnMethod)
{
//Inicializando los atributos
Connected=false;
DeviceName="COM1";
OriginalDCB.DCBlength=sizeof(DCB);
OriginalDCB.BaudRate=9600;
//OriginalDCB.BaudRate=115200;
OriginalDCB.ByteSize=8;
OriginalDCB.Parity=NOPARITY;
OriginalDCB.StopBits=ONESTOPBIT;
OriginalTimeouts.ReadIntervalTimeout=15;
OriginalTimeouts.ReadTotalTimeoutMultiplier=1;
OriginalTimeouts.ReadTotalTimeoutConstant=250;
OriginalTimeouts.WriteTotalTimeoutMultiplier=1;
OriginalTimeouts.WriteTotalTimeoutConstant=250;
ReceiveQueue=32;
TransmitQueue=9;
MaxFails=100000;
ReceiveInterval=0;
}
void __fastcall TCommThread::Execute()
{
unsigned long ReadBytes;
while(Terminated==false)
{
Sleep(ReceiveInterval);
AvailableBytes=BytesAvailable();
if(AvailableBytes>0)
{
ReceivedData.SetLength(AvailableBytes);
if(ReadFile(DeviceHandle,
&(Datos_Rx)/*(void*)ReceivedData.data()*/,
AvailableBytes, &ReadBytes, NULL)==true)
{
if(ReadBytes>0)
{
Synchronize(AfterReceiveData);
ReceivedData="";
}//endif
}//endif
}//endif
}
} |
|
| Volver arriba |
|
 |
jacko Master


Registrado: 03 Sep 2005Mensajes: 287Ubicación: Colombia
|
Publicado: Mie 29 Nov, 2006 5:41 pm Asunto: |
|
|
Siento no poder ayudarte sobre el codigo que publicaste.
Lo que te puedo decir es que existen unos componentes que instalas en el Builder y te permiten hacer la transmision por puerto Serie tan sencillo como decir Puerto->Open(); por supuesto para activar el puerto y Puerto->Putchar('a'); para enviar un dato por el puerto. Y claro, esta la contraparte Getchar().
Estos componentes tan maravillosos se llaman Async Professional o tambien APRO. Si los necesitas me mandas tu correo y te los envio. La instalacion y el funcionamiento es muy sencillo, yo te puedo indicar los pasos y tambien te puedo adjuntar el manual en PDF.
Espero que te sirva mi sugerencia. Me cuentas. _________________ Dios es real... a menos que se declare entero! |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|