RS232



  • Hallo,

    ich bin dabei, den Source-Code für die serielle Schnittstelle zu verstehen, was auch für einen Anfänger gar nicht leicht ist 🙂
    Kann mir bitte jemand kurz erklären, was genau in der Zeile 8 und 9 gemacht wird?

    1  BOOL CSerial::Open (int nComPortNr, int nBaud, int nBits, int nParity, int nStopp)
    2  {
    3     if (INVALID_HANDLE_VALUE != hComm)   
    4        	{
    5          return (TRUE);
    6	}
    7
    8     char szPort[16];
    9
    10    wsprintf (szPort, "\\\\.\\COM%d", nComPortNr);
    11
    12    hComm = CreateFile( szPort,
    13					    GENERIC_READ | GENERIC_WRITE,
    14                        0,
    15                        0,
    16                        OPEN_EXISTING,
    17                        FILE_ATTRIBUTE_NORMAL,
    18                        NULL);
    
    ...
    ....
    

    danke



  • Also in Zeile 8 wird ein char-Array mit 16 Plätzen deklariert.
    In Zeile 9 wird nix gemacht (ausser hier wurde mit hellgrauer Schrift auf gleichfarbigen Hintergrund geschrieben 😃 )



  • ich habe mich verschrieben. ich meinte Zeile 10



  • ich wollte schreiben: ich habe mich vertippt ... gemeint ist Zeile 10



  • 8 char szPort[16];
    9
    10 wsprintf (szPort, "\\\.\\COM%d", nComPortNr);

    8: Es wird ein Array mit einer statischen größe geklariert

    10: das array wird mit inhalt gefüllt - hier die adresse der seriellen schnittstelle

    diese adresse wird dann nacher CreateFile(...) übergeben damit
    CreateFile(...) die Schnittstelle "öffnen" kann

    das sind aber eig. normale standard-funktionen/operationen



  • was bedeutet eigentlich das 2. Argument in der wsprintf((szPort, "\\\.\\COM%d", nComPortNr); ?



  • Loku schrieb:

    was bedeutet eigentlich das 2. Argument in der wsprintf((szPort, "\\\.\\COM%d", nComPortNr); ?

    das bedeutet soviel wie '\.\COMx'.
    das %d ist eine formatangabe für sprintf (dezimalzahl einsetzen).
    ein einzelnes \ muss in einem c-string als \\ geschrieben werden, weil \ eine soganannte escape-sequenz einleitet und \\ steht nunmal für \.
    ein '\.\COM1' sagt Createfile es soll im nt object directory \GLOBAL?? nach dem objekt COM1 suchen, was wiederum ein symbolischer link für '\Device\Serial0' ist und '\Device\Serial0' ist die schnittstelle des rs232 gerätetreibers zum ersten seriellen port...



  • Das ist einfach ein String... und wird zur Formatierung mit dem 3. Parameter verwendet...
    Die vielen Backslashes werden wegen den C/C++ String-Literals benötigt und damit man auch COM-Ports > 9 öffnen kann... (siehe
    http://support.microsoft.com/kb/115831/en-us
    )



  • Danke euch beiden für die Antworten.
    Wie gebe ich dann das ein, wenn ich jetzt nur COM-Ports <= 9 öffnen möchte ?



  • Loku schrieb:

    Wie gebe ich dann das ein, wenn ich jetzt nur COM-Ports <= 9 öffnen möchte ?

    guck mal den link, den jochen gepostet hat...



  • ups, ich habe den Link übersehen.

    Der Kompiler spuckt immer einen Fehler bei der Zeile mit AfxMessage() aus.

    .....................
    	if (m_hComm == INVALID_HANDLE_VALUE) 
                {
    		AfxMessageBox("Error opening serial port");
    		return (FALSE);
                }
    ....................
    

    Fehler: "AfxMessageBox": Durch keine der 2 Überladungen konnten alle Argumenttypen konvertiert werden.


Anmelden zum Antworten