Serielle Schnittstelle



  • Guten Abend Allerseits

    Ich habe da eine Frage an euch:
    Wie kann ich von einem Microcontorller via serielle Schnittstlle einen Wert abfragen?

    Der Microcontoller berechnet laufend 4 Werte, welche ich Holen muss und das ganze dann abspeichern sollt.

    Ich hoffe, ihr könnt mir da helfen.
    Bin kurz vor dem Verzweifeln, da ich das für meine Abschlussarbeit benötige!





  • Danke für die Amtwort.
    Hat aber niemand so etwas schon mal gemacht und könnte mir einfach den Quelltext einstellen. Das wäre natürlich sehr hilfsreich.

    Danke an alle



  • juergschweizer schrieb:

    Hat aber niemand so etwas schon mal gemacht und könnte mir einfach den Quelltext einstellen. Das wäre natürlich sehr hilfsreich.

    Ist das Thema der Abschlussarbeit "Wie lasse ich andere meine Arbeit machen, wenn ich nicht willens oder in der Lage bin, mein Problem hinreiched genau zu beschreiben, und außerdem zu faul zum Suchen"?



  • hmm, ich bin nicht zu fausl, um das zu lernen, ich wurde einfach schlicht weg mit meiner Aufgabe überrannt. Zudem bin ich mit meiner Gesundheit nicht mehr wirlich auf Fordemann (Nervenschwäche).

    Ich wäre auch Hilfsbereit, wenn ich es könnte, aber ich muss für meine Aufgabe extra in 4 Wochen à 3 Tage C++ lernen!



  • Falls Du auf Deinem PC Windows benutzt, so findest Du hier eine ganz gute Lösung.

    Gruß
    Werner



  • im faq dos/win32 konsole ist unter dem beitrag ströme auch ein guter artikel.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo
    Danke für die Antworten.
    Ich habe dazu auch noch ein Buch gefunden, welches mir viel geholfen hat.
    Leider habe ich da aber auch noch ein Problem.
    Ich weiss nicht, an was dass es liegt, aber auch die Lösungen zu den AUfgaben vom Buch gehen nicht! (genau den gleichen Fehler wie ich).

    So nun genug, jetzt kommt mal mein Code:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    HANDLE hComSend, hComRecive;
    int j;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void ShowLastError(AnsiString where)
    {
    MessageBox(NULL,SysErrorMessage(GetLastError()).c_str(),where.c_str(),MB_OK|MB_ICONERROR);
    }
    //----------------------------------------------------------------------------
    
    HANDLE OpenComm(char* Port)
           {
           HANDLE hCom = CreateFile(Port, GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
           if(hCom == INVALID_HANDLE_VALUE)
              ShowLastError("CreateFile: "+AnsiString("Port"));
           return hCom;
           }
    //----------------------------------------------------------------------------
    
    void SetDCB(HANDLE hCom)
    {
    DCB dcb;
    BOOL fSuccess = GetCommState(hCom, &dcb);
    dcb.BaudRate = 4800;
    dcb.ByteSize = 7;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    fSuccess = SetCommState(hCom, &dcb);
    if(!fSuccess) ShowLastError("SetCommState");
    }
    //----------------------------------------------------------------------------
    
    void SetReadTimeouts(HANDLE hCom)
    {
     COMMTIMEOUTS t;
     t.ReadIntervalTimeout = 100;
     t.ReadTotalTimeoutMultiplier=0;
     t.ReadTotalTimeoutConstant = 1;
    
     t.WriteTotalTimeoutMultiplier=0;
     t.WriteTotalTimeoutConstant=0;
     if(!SetCommTimeouts(hCom,&t))
        ShowLastError("SetCommTimeouts");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    hComSend = OpenComm("COM1");
    hComRecive=OpenComm("COM1");
    SetDCB(hComSend);
    SetDCB(hComRecive);
    SetReadTimeouts(hComRecive);        
    }
    
    //----------------------------------------------------------------------------
    int SendData(Char Data[], int n)
    {
    DWORD NumberOfBytesWritten;
    bool b=WriteFile(hComSend,Data,n,&NumberOfBytesWritten,0);
    if(!b)
       ShowLastError("WriteFile");
    return NumberOfBytesWritten;
    }
    //----------------------------------------------------------------------------
    DWORD ReciveData(char*Data, int n)
    {
    DWORD NumberOfBytesRead;
    bool b=ReadFile(hComRecive,Data,n,&NumberOfBytesRead,0);
    if(!b)
       ShowLastError("ReadFile");
    return NumberOfBytesRead;
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::sendenClick(TObject *Sender)
    {
    int n=SendData("Hallo",5);
    Memo1->Lines->Add("Written: "+IntToStr(n));
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::empfangenClick(TObject *Sender)
    {
            for(j=0; j<10; j++)
            {
            Sleep(100);
            const int BufSize = 4;
            char Buffer[BufSize];
            DWORD NumberOfBytesRead = ReciveData(Buffer,BufSize);
            if(NumberOfBytesRead>0)
                    {
                    AnsiString s;
                    for (DWORD i=0; i<NumberOfBytesRead; i++)
                            s=s+Buffer[i];
                    Memo1->Lines->Add("Gelesen n="+IntToStr(NumberOfBytesRead)+" ch="+s);
                    }
                    else
                      Memo1->Lines->Add("Nichts empfangen");
            }
    }
    //---------------------------------------------------------------------------
    

    Evt. muss ich ja noch etwas im Header-File machen, habe aber keine Ahnung was.
    Ach ja, das ganze mache ich im Borland C++ Builder 5.

    Also die Meldung sind Folgende:
    Beim starten: Zugriff verweigert!
    Handle ist unglültig für jede Schnittstelle.



  • Hi,

    was mir beim schnellen drüberlesen aufgefallen ist!
    In deiner Funktion:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    

    Versuchts du 2 mal deine COM1 zuöffnen. Dies ist aber bei der exclusiven Nutzung der SeriellenCom unzulässig. 💡 Deshalb die Fehlermeldung

    ⚠ Außerdem: Zum Lesen und Schreiben reicht ein Handel aus. Welches du beim Öffnen über deine Funktion CreateFile zurück bekommst.
    Also statt hComReceive -> hComSend benützen

    Sonnige Grüsse



  • Hallo
    Vielen Dank für deine Antwort.
    Ich habe es nun geschafft!

    Nur schreiben kann ich noch nicht. Da bin ich momentan noch beschäftigt.


Anmelden zum Antworten