- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Kommunikationsparameter

  1. #11
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    E-Bike
    In meinem oben verlinkten RN-Wissen Beispiel setze ich auch die Timeoutparameter. Hast du das auch implementiert ? offenbar wartet ja der PC, bis er dir die Daten übergibt
    Code:
    COMMTIMEOUTS sTo;
    DCB sDcb;
    
    memset(&sDcb,0,sizeof(sDcb));
    sDcb.DCBlength          = sizeof(sDcb);
    sDcb.BaudRate     = Baud;            // 9600 oder eine andere Baudrate
    sDcb.fParity      = FALSE;
    sDcb.fBinary      = TRUE;
    sDcb.Parity       = NOPARITY;
    sDcb.StopBits     = ONESTOPBIT;
    sDcb.fOutxCtsFlow = FALSE;
    sDcb.fOutxDsrFlow = FALSE; 
    sDcb.fDtrControl = DTR_CONTROL_ENABLE;
    sDcb.fRtsControl = RTS_CONTROL_ENABLE;
    sDcb.fDsrSensitivity    = FALSE;
    sDcb.fAbortOnError = FALSE;
    sDcb.ByteSize     = 8;
    
    if(SetCommState(hFile,&sDcb)) 
    {
      sTo.ReadIntervalTimeout    = MAXDWORD; // 0 ms Read-Timeout
      sTo.ReadTotalTimeoutMultiplier   = 0; 
      sTo.ReadTotalTimeoutConstant     = 0; 
      sTo.WriteTotalTimeoutMultiplier  = 1; // 1*2 ms Write Timeout
      sTo.WriteTotalTimeoutConstant    = 2;
        if(SetCommTimeouts((HANDLE)hFile,&sTo))
    return 1;  // O.K. return
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.09.2009
    Beiträge
    164
    Ich habe deine Einstellungen übernommen:
    Code:
        memset(&dcbSerialParams,0,sizeof(dcbSerialParams));
        dcbSerialParams.DCBlength          = sizeof(dcbSerialParams);
        dcbSerialParams.BaudRate         = CBR_128000;            // 9600 oder eine andere Baudrate
        dcbSerialParams.fParity          = FALSE;
        dcbSerialParams.fBinary          = TRUE;
        dcbSerialParams.Parity           = NOPARITY;
        dcbSerialParams.StopBits         = ONESTOPBIT;
        dcbSerialParams.fOutxCtsFlow     = FALSE;
        dcbSerialParams.fOutxDsrFlow     = FALSE; 
        dcbSerialParams.fDtrControl    = DTR_CONTROL_ENABLE;
        dcbSerialParams.fRtsControl    = RTS_CONTROL_ENABLE;
        dcbSerialParams.fDsrSensitivity    = FALSE;
        dcbSerialParams.fAbortOnError    = FALSE;
        dcbSerialParams.ByteSize         = 8;
    
    
        timeouts.ReadIntervalTimeout    = MAXDWORD; // 0 ms Read-Timeout
        timeouts.ReadTotalTimeoutMultiplier   = 0; 
        timeouts.ReadTotalTimeoutConstant     = 0; 
        timeouts.WriteTotalTimeoutMultiplier  = 1; // 1*2 ms Write Timeout
        timeouts.WriteTotalTimeoutConstant    = 2;
    Hat leider keine Veränderungen gebracht

    Meine Einstellungen mit dem Timeout waren vorher:
    Code:
    tbResult InitSerialPort(HWND hwnd)
    {
        LPCTSTR SeriellerPort = TEXT("COM4");
        hSerial = CreateFile(SeriellerPort,
            GENERIC_READ | GENERIC_WRITE,
            0,
            0,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            0);
    
        if(hSerial==INVALID_HANDLE_VALUE)
        {
            if(GetLastError()==ERROR_FILE_NOT_FOUND)
            {
                // Generate an error
                // Fehlercode ausgeben
                if(!GetProcessId(NULL))
                {
                    
                    MessageBox(hwnd, (LPCWSTR)"Fehler bei LGetProcessId",
                        (LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
                    
                    return TB_ERROR;
    
                }
                //serial port does not exist. Inform user.
                MessageBox(hwnd, (LPCWSTR)L"Fehler bei CreateFile. Serial Port existiert nicht!",
                    (LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
            
                return TB_ERROR;
    
            }
            //some other error occurred. Inform user
            MessageBox(hwnd, (LPCWSTR)L"Fehler bei CreateFile. Sonstiger Fehler!",
                (LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
            
            return TB_ERROR;
        }
    
        if (!GetCommState(hSerial, &dcbSerialParams)) 
        {
            //error getting state
            MessageBox(hwnd, (LPCWSTR)L"Fehler bei GetCommState!",
                (LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
            
            return TB_ERROR;
        }
        
        /*
        memset(&dcbSerialParams,0,sizeof(dcbSerialParams));
        dcbSerialParams.DCBlength          = sizeof(dcbSerialParams);
        dcbSerialParams.BaudRate         = CBR_128000;            // 9600 oder eine andere Baudrate
        dcbSerialParams.fParity          = FALSE;
        dcbSerialParams.fBinary          = TRUE;
        dcbSerialParams.Parity           = NOPARITY;
        dcbSerialParams.StopBits         = ONESTOPBIT;
        dcbSerialParams.fOutxCtsFlow     = FALSE;
        dcbSerialParams.fOutxDsrFlow     = FALSE; 
        dcbSerialParams.fDtrControl    = DTR_CONTROL_ENABLE;
        dcbSerialParams.fRtsControl    = RTS_CONTROL_ENABLE;
        dcbSerialParams.fDsrSensitivity    = FALSE;
        dcbSerialParams.fAbortOnError    = FALSE;
        dcbSerialParams.ByteSize         = 8;
    
    
        timeouts.ReadIntervalTimeout    = MAXDWORD; // 0 ms Read-Timeout
        timeouts.ReadTotalTimeoutMultiplier   = 0; 
        timeouts.ReadTotalTimeoutConstant     = 0; 
        timeouts.WriteTotalTimeoutMultiplier  = 1; // 1*2 ms Write Timeout
        timeouts.WriteTotalTimeoutConstant    = 2;
        */
        
        dcbSerialParams.BaudRate= CBR_128000; //CBR_57600;
        dcbSerialParams.ByteSize=8;
        dcbSerialParams.StopBits=ONESTOPBIT;
        dcbSerialParams.Parity=NOPARITY;
        dcbSerialParams.fOutxCtsFlow=0;
        dcbSerialParams.fOutxDsrFlow=0;
        
        
        if(!SetCommState(hSerial, &dcbSerialParams))
        {
            //error setting serial port state
            MessageBox(hwnd, (LPCWSTR)L"Fehler bei GetCommState beim Parameter belegen!",
                (LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
            
            return TB_ERROR;
        }
        
        timeouts.ReadIntervalTimeout=50;
        timeouts.ReadTotalTimeoutConstant=50;
        timeouts.ReadTotalTimeoutMultiplier=10;
        timeouts.WriteTotalTimeoutConstant=50;
        timeouts.WriteTotalTimeoutMultiplier=10;
        
        if(!SetCommTimeouts(hSerial, &timeouts))
        {
            //error occureed. Inform user
                MessageBox(hwnd, (LPCWSTR)L"Fehler bei Timeout!",
                (LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
            
            return TB_ERROR;
        }
        return TB_OK;
    }
    Schwieriges Thema

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Ich kenne mich mit C nicht aus aber wenn Am PC Flusskontrolle aktiviert ist, wartet der PC auch auf RTS/CTS (in Hartware). Software Protokoll XON XOF wird auch warten also "Flusskontrolle" = Keine einstellen. Warum allerdings mit starker Verzögerung dann doch etwas kommt? Um zumindest schon einmal auf PC Seite sowie die Verbindungen zu Prüfen das dort alles stimmt, Einfach am µC RXD TXD verbinden und am PC irgend etwas eingeben. Das muss sofort wieder Empfangen werden weil der PC durch (die Brücke) mit sich selber "Redet". Jetzt weiß man wenigstens schon "etwas" mehr.

    Diese eigenartige Verzögerung (kann) natürlich auch daran liegen das der µC eine Zeit lang ins Nirwana verschwindet..fehlendes Ret oder Probleme mit dem Stack. Da passiert auch schnell "eigenartiges". Auch und vor Kurzem hatte jemand Stress weil er bei der RS232 Verbindung GND nicht verbunden hatte....

    Gruß Richard

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.09.2009
    Beiträge
    164
    Zitat Zitat von Richard Beitrag anzeigen
    Software Protokoll XON XOF wird auch warten also "Flusskontrolle" = Keine einstellen.
    Habe ich so gemacht:

    Code:
    dcbSerialParams.fOutxCtsFlow     = FALSE;     
    dcbSerialParams.fOutxDsrFlow     = FALSE;
    Hat aber auch nichts genützt

    Standartmäßig stehen die Parameter auf 1.

    Zitat Zitat von Richard Beitrag anzeigen
    Diese eigenartige Verzögerung (kann) natürlich auch daran liegen das der µC eine Zeit lang ins Nirwana verschwindet..fehlendes Ret oder Probleme mit dem Stack. Da passiert auch schnell "eigenartiges". Auch und vor Kurzem hatte jemand Stress weil er bei der RS232 Verbindung GND nicht verbunden hatte....
    Wenn ich mit Bascom von der Konsole sende und empfange klappts ohne Verzögerung. Also müsste der Controller samt Anschluß in Ordnung sein, oder?

    Wie sieht denn der WriteFile bzw. ReadFile in C++ bei euch aus?

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von datatom Beitrag anzeigen
    Wenn ich mit Bascom von der Konsole sende und empfange klappts ohne Verzögerung. Also müsste der Controller samt Anschluß in Ordnung sein, oder?

    Wie sieht denn der WriteFile bzw. ReadFile in C++ bei euch aus?
    Ja, dann sollte das OK. sein, bleibt also nur noch ein Bug in der Software. Leider verstehe ich von C zu wenig, mir liegt einfach dessen Syntax und Tastaturbelegung absolut NICHT und bin auch zu faul das alle neu zu erlernen. Eher fange ich wieder mit ASM an, das konnte ich ziemlich gut. Ist ja auch relativ einfach weil sehr Hartware nah, man sieht quasi bei jedem Befehl was man macht b.z.w. was passiert. Aber für relativ kleine Sachen reicht auch Bascom und das lässt sich auch mit einer Deutschen Tastatur und 2 Finger Tipp System noch halbwegs gut schreiben.

    Gruß Richard

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.09.2009
    Beiträge
    164
    Mit welchen Parametern der DCB Struktur kann ich das handshake ausschalten?

    Muss ich eigentlich beim verändern der Parameter aud Bascom-Seite auch was verändern?

    Bisher habe ich dort folgende Einstellungen:

    Config Com4 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von datatom Beitrag anzeigen
    Mit welchen Parametern der DCB Struktur kann ich das handshake ausschalten?

    Muss ich eigentlich beim verändern der Parameter aud Bascom-Seite auch was verändern?

    Bisher habe ich dort folgende Einstellungen:

    Config Com4 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    µC's arbeiten in der Regel ohne handshake, Terminals wie Hyperterm b.z.w. PC Com Einstellungen überwiegend mit. Das kann man dann in der Systemsteuerung Com Port Eigenschaften auf Flussteuerung "keine" für jeden Port einzeln ändern.

    Bei bestimmten Anwendungen (Programm Abläufen) vom µC kann Handshake nötig sein, Das RTS/CTS u.s.w. muss man dann halt selber "basteln" und entsprechende Port Pins dafür einrichten.

    Gruß Richard

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen