nochmal: der Com-Port (Bitfolgen)



  • 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