TXD von COM1 setzen



  • Huhu,
    ich suche ein C++ Äquivalent zu folgendem VisualBasic-Code:

    i = OPENCOM("COM1:")
     TXD 1
     etc.
    

    Er öffnet erst den Port COM1 und gibt dann Strom auf den Pin COM1.

    Schon mal vielen Danke 😉



  • Geht nicht. Du kannst nur 3 Pins direkt ansprechen. Tx gehört nicht dazu.
    Für serielle Kommunikation siehe:
    http://www.codeproject.com/system/serial.asp



  • Und wie macht VB das dann?
    Codeauszug der funzt:

    Private Sub Command1_Click()
     RTS 1
     Picture1.BackColor = &HFF00&
    End Sub
    
    Private Sub Command2_Click()
      RTS 0
      Picture1.BackColor = &HC0C0C0
    End Sub
    
    Private Sub Command3_Click()
     DTR 1
     Picture2.BackColor = &HFF00&
    End Sub
    
    Private Sub Command4_Click()
      DTR 0
      Picture2.BackColor = &HC0C0C0
    End Sub
    
    Private Sub Command5_Click()
      TXD 1
      Picture3.BackColor = &HFF00&
    End Sub
    
    Private Sub Command6_Click()
     TXD 0
     Picture3.BackColor = &HC0C0C0
    End Sub
    

    😮

    Den Link kenn ich bereits...Der Source is aber bisl komplex.
    Ich hab jetzt folgendes geschrieben:

    #include <stdio.h>
    #include <windows.h>
    #include <conio.h>
    
    int main(int argc, char *argv[])
    {
    DCB dcb;
    HANDLE hCom;
    BOOL fSuccess;
    char *pcCommPort = "COM1";
    
    hCom = CreateFile( pcCommPort,
    GENERIC_READ | GENERIC_WRITE,
    0, // must be opened with exclusive-access
    NULL, // no security attributes
    OPEN_EXISTING, // must use OPEN_EXISTING
    0, // not overlapped I/O
    NULL // hTemplate must be NULL for comm devices
    );
    
    if (hCom == INVALID_HANDLE_VALUE)
    {
    // Handle the error.
    printf ("CreateFile failed with error %d.\n", GetLastError());
    getch();
    return (1);
    }
    
    // Build on the current configuration, and skip setting the size
    // of the input and output buffers with SetupComm.
    
    fSuccess = GetCommState(hCom, &dcb);
    
    if (!fSuccess)
    {
    // Handle the error.
    printf ("GetCommState failed with error %d.\n", GetLastError());
    getch();
    return (2);
    }
    
    // Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.
    
    dcb.BaudRate = CBR_57600; // set the baud rate
    dcb.ByteSize = 8; // data size, xmit, and rcv
    dcb.Parity = NOPARITY; // no parity bit
    dcb.StopBits = ONESTOPBIT; // one stop bit
    
    fSuccess = SetCommState(hCom, &dcb);
    
    if (!fSuccess)
    {
    // Handle the error.
    printf ("SetCommState failed with error %d.\n", GetLastError());
    getch();
    return (3);
    }
    
    printf ("Serial port %s successfully reconfigured.\n", pcCommPort);
    
    DWORD dwError,
          dwNumBytesWritten;
    BYTE Byte = 256;
    
    while (1)
    {
    WriteFile (hCom,              // Port handle
               &Byte,              // Pointer to the data to write 
               1,                  // Number of bytes to write
               &dwNumBytesWritten, // Pointer to the number of bytes 
                                   // written
               NULL                // Must be NULL for Windows CE
    );
    }
    return (0);
    
    }
    

    Wenn ich das ausführe dann Blinkt die an TXD angeschlossene LED schnell!
    Woran liegt das?

    Danke im voraus



  • Mit SetCommState kannst Du folgendes setzen/löschen:
    - DTR (DTR_CONTROL_DISABLE / DTR_CONTROL_ENABLE)
    - RTS (RTS_CONTROL_DISABLE / RTS_CONTROL_ENABLE)

    Alle anderen Pins können nicht direkt kontrolliert werden.

    PS: Dein Beispiel hat überhaupt nichts mit VB zu tun, sondern bezieht sich auf eine DLL (RSLINE.DLL) und die kannst Du natürlich auch in VC++ verwenden (wenn keine LIB vorhanden ist, dann einfach via LoadLibrary/GetProcAddress)



  • Cool Danke 🙂
    Da ich nur Codeschnippsel hab (und _KEIN_ VB kann) wusste ich nicht das das über eine DLL geht.
    1 Frage hab ich noch(außer ich komm dann mit der DLL nicht zurecht):
    Wie schafft die DLL das setzen/löschen?

    Danke im voraus



  • COMCOM schrieb:

    Wie schafft die DLL das setzen/löschen?

    Das Frage ich mich allerdings auch... vermutlich setzt sie die Baudrate so hoch, dass man es mit dem normalen Auge nicht mehr sieht, dass es kein ständiges 1 bzw. 0 Signal ist. Mit dem Oszi wirst Du aber vermutlich feststellen, dass es kein stäündiges 1 bzw. 0 Signal ist.



  • Ok Danke 🙂
    Naja jetzt kommt noch das nutzen der DLL 😃
    Mein Stümperhafter Versuch:

    #include <stdio.h>
    #include <windows.h>
    #include <conio.h>
    
    typedef void (LPFNDLLFUNC1(int));
    LPFNDLLFUNC1 TXD; 
    HINSTANCE hDLL;
    
    int main(int argc, char *argv[])
    {
    hDLL = LoadLibrary("ELEXS.dll");
    
    TXD = (LPFNDLLFUNC1)GetProcAddress(hDLL,"TXD"); 
    
    while(1)
    {
    TXD(1);
    }
    return 0;
    }
    

    Nur meckert er immer:

    13 invalid cast to function type `void ()(int)'

    Weißt du was ich falsch mach?Bin total neu auf dem Gebiet DLLs verwenden 😃

    Danke im voraus



  • Du solltest folgendes nehmen:

    typedef void (__stdcall *tTXD)(short iVal);
    tTXD pTXD = NULL;
    pTXD = (tTXD) GetProcAddress(hDLL, "TXD");
    


  • Vielen Dank 🙂
    Ich habs jetzt aber ohne DLL gemacht.
    Naja und jetzt hab ich aber noch ein paar Fragen,um sicherzustellen das ich alles verstanden hab,was die Ausgabe betrifft.

    TXD ist zum ausgeben gedacht und kann nur auf Strom gesetzt werden wenn man _ständig_ Daten sendet (in einem extra Thread)

    DTR und RTS kann man mit

    EscapeCommFunction(hCom, SETDTR | SETRTS);
    

    setzen/löschen.

    Es gibt also NUR diese 3 Pins zu Ausgabe,oder?
    Und zur Eingabe gibt es RI,DCD DSR und CTS,oder?
    Und muss ich auf etwas achten wenn ich mit Framdspannung an den Eingängen Arbeite?
    Ab +1.5V wird der Eingang ja als Logisch 1 erkannt.
    Muss ich den - oder den + Pol mit einem der 4 Eingänge verbinden?Also bei Fremdspannung(ne 1.5V Batterie).
    Und welchen Wiederstand sollte ich nutzen bei einer 9V Batterie?
    Fragen über Fragen,ich hoffe du kannst sie mir beantworten 🙂

    Schon mal vielen Dank,ohne dich wär ich verloren 😃

    P.S.:Darf ich diesen Thread pushen wenn ich Probleme mit der Eingabe oder anderen Sachen hab die mit dem COM Port zu tun haben??



  • Es gibt 2 Pins zur Ausgabe (DTR und RTS). TXD kann man ja nicht auf 1 setzen...
    Um da was dran zu schakten solltest Du Grundgkenntnisse in Elektronik haben... und natürlich die Schnittstellenspezifikation kennen (+/- 3-12V; invertiert).
    Aber dazu ist dieses Forum vermutlich nicht ganz richtig...
    Pushen darfst Du den Thread immer wenn Du noch fragen hast...



  • Ok jetzt hab ich eine,imo speziell auf C/C++ bezogen:

    Gerade hat

    EscapeCommFunction(hCom, SETDTR | SETRTS);
    

    Noch Strom gegeben...Jetzt nichtmehr 😮
    Der ganze Code:

    #include <stdio.h>
    #include <windows.h>
    #include <conio.h>
    
    int main(int argc, char *argv[])
    {
    DCB dcb;
    HANDLE hCom;
    BOOL fSuccess;
    char *pcCommPort = "COM1";
    
    hCom = CreateFile( pcCommPort,
    GENERIC_READ | GENERIC_WRITE,
    0, // must be opened with exclusive-access
    NULL, // no security attributes
    OPEN_EXISTING, // must use OPEN_EXISTING
    0, // not overlapped I/O
    NULL // hTemplate must be NULL for comm devices
    );
    
    if (hCom == INVALID_HANDLE_VALUE)
    {
    // Handle the error.
    printf ("CreateFile failed with error %d.\n", GetLastError());
    getch();
    return (1);
    }
    
    // Build on the current configuration, and skip setting the size
    // of the input and output buffers with SetupComm.
    
    fSuccess = GetCommState(hCom, &dcb);
    
    if (!fSuccess)
    {
    // Handle the error.
    printf ("GetCommState failed with error %d.\n", GetLastError());
    getch();
    return (2);
    }
    
    // Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.
    
    dcb.BaudRate = CBR_57600; // set the baud rate
    dcb.ByteSize = 8; // data size, xmit, and rcv
    dcb.Parity = NOPARITY; // no parity bit
    dcb.StopBits = ONESTOPBIT; // one stop bit
    
    fSuccess = SetCommState(hCom, &dcb);
    
    if (!fSuccess)
    {
    // Handle the error.
    printf ("SetCommState failed with error %d.\n", GetLastError());
    getch();
    return (3);
    }
    
    printf ("Serial port %s successfully reconfigured.\n", pcCommPort);
    
    DWORD dwError,
          dwNumBytesWritten;
    BYTE Byte = 256;
    EscapeCommFunction(hCom, SETDTR | SETRTS);
    while (1)
    {
    
    WriteFile (hCom,              // Port handle
               &Byte,              // Pointer to the data to write
               1,                  // Number of bytes to write
               &dwNumBytesWritten, // Pointer to the number of bytes
                                   // written
               NULL                // Must be NULL for Windows CE
    );
    }
    return (0);
    
    }
    

    Das ist doch nicht normal,oder??

    Schon mal Danke



  • Wenn es gerade ging und jetzt nicht mehr ist Deine Schnittstelle kapput 😢



  • Das ist ja das komische,das VB Programm funzt noch 😮

    cout << "CLR " << EscapeCommFunction(hCom, CLRDTR | CLRRTS ) << endl;
    cout << "SET " << EscapeCommFunction(hCom, SETDTR | SETRTS ) << endl;
    

    gibt auch beidemale 1 aus...
    Und was mich noch sehr intressieren würde:

    Und muss ich auf etwas achten wenn ich mit Framdspannung an den Eingängen Arbeite?
    Ab +1.5V wird der Eingang ja als Logisch 1 erkannt.
    Muss ich den - oder den + Pol mit einem der 4 Eingänge verbinden?Also bei Fremdspannung(ne 1.5V Batterie).
    Und welchen Wiederstand sollte ich nutzen bei einer 9V Batterie?

    😃

    Schon mal Danke



  • Ok ich weiß jetzt was falsch ist:
    EscapeCommFunction(hCom, SETDTR )
    funzt...
    Man darf sie also nicht mit | verbinden...



  • So 🙂
    ICh hoffe es macht nichts wenn ich einen 3fach Post mache,aber es hat sich "einiges" getan.
    Also ich hab mir jetzt ne Klasse geschrieben für den Port.
    Naja ich hab dann versucht RI mit dem -(und auch mal mit dem +)Pol einer 9V
    Batterie zu verbinden,aber er erkennt keine Spannung...Was muss ich tun um
    Fremdspannung zu nutzen?
    Und vorallem gibt es einen Trick/eine Möglichkeit wie ich dem Programm irgendwie mehr Daten mitteilen kann?
    Bis jetzt kann es ja nur zwischen 4 verschiedene Anweisungen bekommen(jeweils einen Pin auf 1/0 für eine Anweisung)!
    Aber ich möchte ca 20 verschiedene Anweisungen unterscheiden.
    Also 20 Schalter die ich dann alle auslesen kann.Gibt es da nen Trick?

    Schon mal Danke 😃



  • 1. Du musst den GND natürlich auch noch mit der Spannungsquelle verbinden, damit überhaupt ein Strom fliessen kann.
    2. Wenn Du viele Ein-/Ausgänge anschliessen willst, rate ich Dir prinzipiell zu einer vernüftigen Hardware die das kann (gibt es heute schon für ca. 20 Eur).
    3. Wenn Du es doch selber machen willst, musst Du multiplexing machen... für 20 Eingänge brauchst Du aber 6 Leitungen



  • Ok thx 🙂
    Welche Hardware meinst du?Hast du ein Stichwort oder gar nen Link für mich?
    Würd mir echt helfen 😛

    Schon mal Danke



  • Z.B.
    http://www.elv.de/Shopping/ArtikelDetail.asp?Referenz=418-04&Gruppe=ME-PC&Stufe=2

    da gibt es aber zig-Anbieter und Du solltest vielleicht mal in einem Hardware-Forum fragen...



  • Ok Danke!
    Du kennst nicht zufällig ein Forum das für solche Fragen gut ist?
    Google spuckt bei Hardware Forum leider nur irgendwelche Foren aus die z.B. beim
    Kauf beraten 😞

    Danke im voraus



  • SETBREAK
    

    und

    CLRBREAK
    

    in der Funktion

    EscapeCommFunction
    

    verwenden, um TxD zu setzen? Oder gleich

    SetCommBreak
    

    und

    ClearCommBreak
    

    verwenden?

    Die serielle Schnittstelle liest und schreibt Daten seriell - will man also mehr als ein Bit setzen/abfragen, so muss das eben nacheinander passieren. Das geht ganz wunderbar mit Schieberegistern, die auch in den UARTs drin sind, z. B.: so: http://www.skilltronics.de/versuch/elektronik_pc/elektronik_pc.html

    Die DLL port.dll kann man auch mit einem passenden Header unter W32-Systemen verwenden.

    Blackbird


Anmelden zum Antworten