nochmal: der Com-Port (Bitfolgen)



  • Wollte wissen, wie ich bestimmte Bitfolgen zur Com rausschicken kann (z.B. 01110101, 11100010, ...). Hab auch etwas rumgesucht, und bin auf WriteFile und WriteFileEx gestossen. Hab aber ein paar probs mit den Parametern (oder mit dem Englisch ?)

    LPCVOID lpBuffer,
    DWORD nNumberOfBytesToWrite

    hab nicht ganz verstanden, was er hier verlangt. also lpBuffer verlangt er ja ein Zeiger auf einen Buffer, nur: Was ist ein Buffer (eben doch das Englisch)??
    nNumberOfBytesToWrite ist im Grunde genommen klar, nur dass ich nicht ganz verstehe wieso er das braucht, da er ja die File kennt, und so auch deren Grösse...

    Bräuchte hier also nun eure Hilfe, ev. reicht schon die Erklärung von "Buffer", wobei ich einem kleinen Beispiels Code natürlich nicht abgeneigt wäre.

    big thx 4 answers
    simon

    [ Dieser Beitrag wurde am 21.10.2002 um 18:25 Uhr von simon_210 editiert. ]



  • Hallo,

    das mit dem English muss Dir nicht peinlich sein. Nicht jeder wird englisch-sprechend geboren....wie ich. Ist aber nur ein kleiner Vorteil, der nütz Dir echt nix wenn Du die konzepte nicht verstehst.

    Also was ist ein Puffer?

    Stell Dir mal eine Brief vor den Du bekommst, dieser Brief wird doch in deinen
    Briefkasten geworfen. Dabei kannst Du Dir vorstellen das dein Briefkasten eine art Buffer, ein Zwischenlager ist, bevor Du den Brief aus dem Kasten nimmst verweilt er da.
    Nun zu der Windows API:

    Der Brief stellt die Daten dar, die Du bekommen möchtest oder die Du senden willst. Sendest Du den Brief bracuht der Empfänger einen PUFFER um die Daten(Brief) zwischenzu speicher damit diese nicht verloren gehen. Auch bei dem Senden benötigt man einen PUFFER um die Daten aus diesem zu lesen. Wichtig ist aber das dein Breifkasten großgenug ist, um auch das Päckhen(die Daten) zu empfangen. Von daher ist es wichtig das Du den Buffer groß genug auslegst. Ist der Puffer zu klein kommen die daten nicht alle rein oder werden erst garnicht genommen. Das ist die Logik eines Puffers....!

    Nun zu deinem COM1 Problem:

    Hier sind die Funktionen die Du brachen wirst um auf den COM-PORT zu schreiben:

    Ich bin mir aber nicht mehr 100% sicher ob das nun aus dem stehgreif stimm 🙂

    DCB dcb;
    HANDLE hCom;
    DWORD dwError;
    BOOL fSuccess;

    hCom = CreateFile( "COM1",
    GENERIC_READ | GENERIC_WRITE,
    0, // exclusiver Zugriff auf den COM1 Port
    NULL, // Keine SECURITY_ATTRIBUTES
    OPEN_EXISTING, // öffne ein vorhandenes COM1
    0, // Keine überlappende Ein/Ausgabe
    NULL // hTemplate erfordert NULL für Communications Devices
    );

    if (hCom == INVALID_HANDLE_VALUE)
    {
    dwError = GetLastError();

    // handle error
    }

    Und mit WriteFile kannst Du dann auf den PORT schreiben....

    Solltest Du noch Fragen haben kannst Du mir geren Mailen...

    Gruß Ken



  • mir ging es vor allem um den Gebrauch von WriteFile, und wo ich nun sagen kann welche Bitfolge er verschicken soll und auch wie die Parameter von WriteFile aussehen.

    simon



  • Hallo nochmal!

    Ich habe hier mal was schnelles zusammengeschuster. DU müsstest es aber mal testen, da ich meine COM1 deaktiviert habe(wegen Ressourcen)

    #include<windows.h>
    
    //#include<ras.h>
    //#include<raseapif.h>
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    
    {
    
        long DATA;
        DATA = 0x007;
    
        long Err;
        ULONG D_WRITTEN;
        HANDLE fHandle = CreateFile("COM1",
                                GENERIC_READ|GENERIC_WRITE,
                                NULL,
                                NULL,
                                OPEN_EXISTING,
                                NULL,
                                NULL);
    
        WriteFile(fHandle, //Handle der Datei oder was auch immer                 &DATA, Daten die Du schreiben willst (Puffer)
              sizeof(DATA), //Die grösse der Daten zum schreiben 
              &D_WRITTEN, //Gibt zurück wieviel geschrieben wurde
              NULL); 
    
        Err = GetLastError(); //Letzten Fehler ermitteln
    
        return 0;
    
    }
    

    Check das mal und schreib zurück!!



  • Hallo, kleiner Fehler in der Darstellung des Codes!
    SO muß es aussehen:

    WriteFile(fHandle,
                  &DATA,
                  sizeof(DATA),
                  &D_WRITTEN,
                  NULL);
    

    Gruß Ken



  • vielen dank für die Antwort, das wars was ich suchte 😃 😃 😃

    habs auch gleich versucht und MSVC hat keine Fehler gemeldet, allerdings konnte ich noch nicht testen, was ausgegeben wird, da ich die dafür gedachte Schaltung noch nicht komplett habe, werde das aber heute abend noch nachholen.

    nochmal big thx

    simon



  • Hallo nochmal,

    machst Du was mit Hardware..............klingt interessant!
    Würde mich mal interessieren was das fuer eine Hardware ist.
    Habe auch viel Diagnosewerkzeuge für Hardware gemacht....
    ist aber schon laaaaaaaaaaaaaaaaaaaaange her 🙂

    Gruß Ken



  • ich häng über einen MAX232 ein µController an die Com, um dann Schieberegister anzusteuern, damit ich möglichst viele Lämpchen (oder einfach Schalter, Transistoren etc.) mit dem PC steuern kann.

    simon



  • Hallo,

    ah ha, also eine Art Schaltstation. Da kann ich Dir aber was feines
    empfehlen: Da gibt es etwas von Conrad Electronic, einen Microcontroler
    der Spitzenklasse, I2C-Bus und und und...

    Das Teil heist C-Control und ist die Bombe von Microcontroler!
    Programmierbar in Assembler und C.

    www.conrad.de



  • hab jetzt endlich die Schaltung, um das auch zu versuchen, und siehe da:

    Es klappt NICHT 😞 😡 😕

    ich hab zum Test ein kleines MFC proggie gemacht (hatte ich z.T. schon, desshalb). Die Schnittstelle hab ich bestimmt richtig initialisiert, da sie in anderen Fällen (nur setzten/löschen) bereits einwandfrei funktioniert hat.

    diese Funktion hab ich einfach an eine Schaltfläche "gekoppelt":

    void CComtestDlg::Onsend00() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
        data = 0x00;
    
        WriteFile(hCom, //Handle der Datei oder was auch immer                 
             &data, //Daten die Du schreiben willst (Puffer)
             sizeof(data), //Die grösse der Daten zum schreiben 
             &D_WRITTEN, //Gibt zurück wieviel geschrieben wurde
             NULL); 
    
    }
    

    data hab ich als Member-Variable des Typs long erstellt
    D_WRITTEN hab ich als Member-Variable des Typs ULONG erstellt
    ach und als handle hab ich hCom (wie du siehst), wie gesagt richtig initialisiert

    beim Ausführen gibt der MSVC keine Fehler zurück, und dennoch scheint die Bitfolge nicht beim µC anzukommen.

    hab ich da was falsch gemacht? Oder gibt es vielleicht eine einfachere Lösung um zu schauen was zur COM rauskommt ?

    simon

    [ Dieser Beitrag wurde am 23.10.2002 um 22:21 Uhr von simon_210 editiert. ]



  • muss ich da vielleicht irgendwas bei den Einstellungen des Com-Ports ändern ?

    simon



  • Hallo,

    sicherlich hast Du die Möglichkeit die Einstellungen des COM Portes zu ändern, aber ich habe momentan nicht die Doku verfügbar(MSDN Files korrupt!)

    Aber es gibt einen Weg, ich schaue mal nach.......

    Gruß Ken



  • Original erstellt von simon_210:
    **
    (...)
    hab ich da was falsch gemacht? Oder gibt es vielleicht eine einfachere Lösung um zu schauen was zur COM rauskommt ?

    simon
    **

    Portmon
    Copyright (C) Mark Russinovich
    Freeware
    http://www.sysinternals.com



  • hab portmon laufen lassen, aber leider meldete das nur Length: 4: .... anstatt Length: 8: 11111111 (wie bei einem Terminal-Prog)

    irgendwas ist also falsch...
    nur was????

    simon

    0.00013760 Comtest VCOMM_OpenComm COM1 SUCCESS
    0.00000400 Comtest VCOMM_EscapeCommFunction COM1 SUCCESS CLRTIMERLOGIC
    0.00000240 Comtest VCOMM_EscapeCommFunction COM1 SUCCESS IGNOREERRORONREADS
    0.00000480 Comtest VCOMM_SetupComm COM1 SUCCESS RxSize: 4096 TxSize: 0
    0.00000240 Comtest VCOMM_GetCommState COM1 SUCCESS Baud: 9600 Bits: 8 Stop: 1 Parity: None
    0.19935680 Comtest VCOMM_SetCommState COM1 SUCCESS Mask: fff Baud: 9600 Bits: 8 Stop: 1 Parity: None
    0.00000400 Comtest VCOMM_GetCommQueueStatus COM1 SUCCESS RX: 0 TX: 0
    0.00000400 Comtest VCOMM_SetWriteCallBack COM1 SUCCESS Trigger: 1
    0.00000720 Comtest VCOMM_WriteComm COM1 SUCCESS Length: 4: ....
    0.00000400 Comtest WriteNotifyProc COM1 VOID TRANSMIT: TXCHAR
    0.00000320 Comtest VCOMM_SetWriteCallBack COM1 SUCCESS Trigger: -1
    0.00000320 Comtest VCOMM_GetCommQueueStatus COM1 SUCCESS RX: 0 TX: 0
    0.00000480 Comtest VCOMM_GetCommQueueStatus COM1 SUCCESS RX: 0 TX: 0
    0.00000320 Comtest VCOMM_SetWriteCallBack COM1 SUCCESS Trigger: 1
    0.00000720 Comtest VCOMM_WriteComm COM1 SUCCESS Length: 4: ....
    0.00000400 Comtest WriteNotifyProc COM1 VOID TRANSMIT: TXCHAR
    0.00000320 Comtest VCOMM_SetWriteCallBack COM1 SUCCESS Trigger: -1
    0.00000320 Comtest VCOMM_GetCommQueueStatus COM1 SUCCESS RX: 0 TX: 0
    0.00000720 Comtest VCOMM_EscapeCommFunction COM1 SUCCESS CLRDTR
    0.00105280 Comtest VCOMM_CloseComm COM1 SUCCESS



  • na ja, wenn da 4 Zeichen ankommen, dann schiebst du auch nur 4 Zeichen rein bzw. sagts bei WriteFile() er soll 4 Zeichen schreiben.

    Was steht denn in LPDWORD lpNumberOfBytesWritten von WriteFile nach dem Schreibzugriff?

    ...oder Protokollproblem??

    aber mal generell: Bitfolge? Zeichen?
    1 Zeichen sind doch bereits 16 Bit ... oder hab ich hier was generelles überlesen??

    [ Dieser Beitrag wurde am 24.10.2002 um 22:01 Uhr von Ulli editiert. ]



  • Hallo @simon_210,

    wo genau ist Dein Problem?
    Length 4 heißt doch nur, daß 4 Zeichen (in Deinem Fall je 8 Bit lang) gesendet worden sind. Jedes Zeichen noch vornedran mit Startbit und einem Stopbit hinten dran. Also genau 10 "bits" pro Zeichen und das 4 mal. Wenn der Controller den Inhalt der so eingerahmten 8 Bits nicht versteht, liegt es am Inhalt der von Dir gesendeten 4 Bytes, nicht an der Programmierung des COM-Ports.
    In Deiner Eingangsfrage war von "bestimmten Bitfolgen" die Rede, die Du senden willst. Kann Dein Controller denn das serielle Format (9600 Bits:8 Stop:1 Parity:None + Stopbit) verarbeiten? Hat also einen "echten" seriellen Port? Oder wird nur an einem Pin eine Bitfolge erwartet? Wann das so ist, kannst Du den Tx-Ausgang des PC-COM-Ports nicht verwenden (wegen dem zusätzlichen Start- und Stopbit), sondern solltest DTR oder RTS verwenden, um "bestimmte Bitfolgen" zu generieren.

    EscapeCommFunction (hCom, CLRDTR); // DTR Rücksetzen
    EscapeCommFunction (hCom, CLRRTS); // RTS Rücksetzen
    und
    EscapeCommFunction (hCom, SETDTR); // Setzten der DTR
    EscapeCommFunction (hCom, SETRTS); // Setzten der RTS

    Natürlich muß der COM-Port wie immer erst geöffnet und am Ende aller Kommunikation auch wieder geschlossen werden.

    Blackbird



  • klar versteht der µC das UART-Protokoll

    zu dem length 4, habs das ganze mit nem terminal-prog gemacht, und da kam length 8: 11111111, irgendwas stimmt da also wirklich nicht, ich denke, das sich das length auf die anzahl Bits bezieht, und nicht auf die Anzahl Zeichen...

    simon


Anmelden zum Antworten