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)+" ";
    

Anmelden zum Antworten