Warten auf serielle Übertragung
-
Hallo zusammen,
wie stelle ich es an, daß eine Funktion zum Empfang der Daten von der seriellen Schnittstelle nur dann aufgerufen wird, wenn auch wirklich etwas von der seriellen Schnittstelle kommt (also ähnlich dem Ereignis eines Buttonklicks)?
Ich verwende die Klasse CSERIELL aus diesem Forum.MFG
Andy
-
Is zwar kein Hilfe ab ein ansatz. Es muss aufjeden falle eine Nachrciht komme damit das nur zu bestimment events aufgerufen würt nur die Frage ist ob es für sowas ne Message giebt.
-
WaitCommEvent
-
Hallo zusammen,
nach zahllosen Versuchen komme ich nicht weiter.
Ich habe WaitCommEvent() implementiert und es funktioniert
im Prinzip auch, doch wird die Anwendung solange blockiert,
bis etwas am seriellen Port empfangen wird. Nun muß ich das
sicherlich über Threads laufen lassen. Leider kenne ich mich
mit dem Einsatz von Threads nicht aus.
Im Prinzip soll die Aktualisierung der Anzeige für die
gesendeten/empfangenen Daten im Hintergrund laufen, d.h. die
Funktion zur Anzeige der Daten soll automatisch aufgerufen werden, wenn etwas
vom Programm gesendet bzw. empfangen wurde.Könnte jemand kurz erklären, wie ich das lösen muß, bzw. hätte jemand
einen guten Link, wo der Einsatz von Threads an einfachen Beispielen
VERSTÄNDLICH erklärt wird?Die Beispiele aus dem Netz (z.B. codeproject.com) haben mir nicht
wirklich weiter geholfen, da dort viel umfangreichere Klassen als
die CSERIELL aus diesem Forum verwendet wurden und ich die genannte
gerne weiterhin einsetzen möchte.MFG
Andy
-
Hi!
hmm hast du schon probiert ein Threed zu Starten wo die Funktion Gestartet wird`?
-
Hallo Sven,
welche Fkt. meinst Du, WaitCommEvent() oder die zur Ausgabe? Letzteres macht wohl keinen Sinn, weil ja WaitCommEvent() die Anwendung "blockiert", oder habe ich's falsch verstanden? Ich habe echt keinen Plan, wie das dann auszusehen hat.
MFG
Andy
-
[cpp]
__fastcall TSerThread::TSerThread(void) : TThread(False)
{
// Thread-Initialisierung
FreeOnTerminate = true;
}
void __fastcall TMainForm::InitSerThread(void)
{
//--- Serial Terminal Thread anlegen ----
SerThread=new TSerThread(); // Thread anlegen
}
void __fastcall TMainForm::TerminateThread(void)
{
//--- Serial Terminal Thread löschen ----
SerThread->Terminate();
}
void __fastcall TSerThread::Execute()
{
// Thread-Routine, wird beim Start des Thread durchlaufen
#define TempBufSize 46096
DWORD InQue, OutQue;
DWORD ToRead, HasRead;
unsigned char Buf[TempBufSize]; // temporärer Empfangspuffer
AnsiString AsZeichen;
DWORD e;
char Empfanstext[100];
int a,i,x,y,z,f;
i=0;
while (!Terminated)
{
i++;
//MainForm->TerminalChild->LabelRxD->Caption=IntToStr(i);
if (WaitCommEvent(MainForm->Cid,&e,NULL))
{
// An der Schnittstelle ist vorgegebenes Ereignis aufgetreten
DataInBuffer(MainForm->Cid,&InQue,&OutQue);
//MainForm->TerminalChild->LabelTxD->Caption=IntToStr(OutQue);
if (InQue>0)
{
// Daten stehen im Empfangspuffer
ToRead=InQue;
if (ToRead>TempBufSize)
{
ToRead=TempBufSize;
}
//RS232 Daten in Buf auslesen
if (!ReadFile(MainForm->Cid,&Buf,ToRead,&HasRead,&Overlapped))
{
LPTSTR lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
MessageBox( NULL, lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );// Free the buffer.
LocalFree( lpMsgBuf );
}// Empfangene Zeichen in MemoRxD übernehmen
Buf[HasRead]=0;
for (f=0;f<HasRead;f++)
{
MainForm->uiTimeout=0;
AsZeichen=AsZeichen.IntToHex((unsigned int)Buf[f],2)+" ";und so weiter..
-
__fastcall TSerThread::TSerThread(void) : TThread(False) { // Thread-Initialisierung FreeOnTerminate = true; } void __fastcall TMainForm::InitSerThread(void) { //--- Serial Terminal Thread anlegen ---- SerThread=new TSerThread(); // Thread anlegen } void __fastcall TMainForm::TerminateThread(void) { //--- Serial Terminal Thread löschen ---- SerThread->Terminate(); } void __fastcall TSerThread::Execute() { // Thread-Routine, wird beim Start des Thread durchlaufen #define TempBufSize 46096 DWORD InQue, OutQue; DWORD ToRead, HasRead; unsigned char Buf[TempBufSize]; // temporärer Empfangspuffer AnsiString AsZeichen; DWORD e; char Empfanstext[100]; int a,i,x,y,z,f; i=0; while (!Terminated) { i++; //MainForm->TerminalChild->LabelRxD->Caption=IntToStr(i); if (WaitCommEvent(MainForm->Cid,&e,NULL)) { // An der Schnittstelle ist vorgegebenes Ereignis aufgetreten DataInBuffer(MainForm->Cid,&InQue,&OutQue); //MainForm->TerminalChild->LabelTxD->Caption=IntToStr(OutQue); if (InQue>0) { // Daten stehen im Empfangspuffer ToRead=InQue; if (ToRead>TempBufSize) { ToRead=TempBufSize; } //RS232 Daten in Buf auslesen if (!ReadFile(MainForm->Cid,&Buf,ToRead,&HasRead,&Overlapped)) { LPTSTR lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the string. MessageBox( NULL, lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION ); // Free the buffer. LocalFree( lpMsgBuf ); } // Empfangene Zeichen in MemoRxD übernehmen Buf[HasRead]=0; for (f=0;f<HasRead;f++) { MainForm->uiTimeout=0; AsZeichen=AsZeichen.IntToHex((unsigned int)Buf[f],2)+" ";