Serielle Schnittstelle

Gast #2016798
Lesenswert?

Hallo zusammen,

habe mir das Buch: "Windows Programmierung(Petzold) Entwicklerhandbuch 
für Win32 API" bestellt. Heute ist es angekommen. 1300 Seiten stark und 
nichts über die serielle Schnittstelle!

Okay also schluss mit meiner Lebensgeschichte ;)

Ich habe die serielle Schnittstelle bereits programmiert. D. h. mein µC 
sendet Daten an den PC und ich kann diese dann weiter in einem Programm 
verwenden.


Jetzt kommt aber das Problem. Der Port aktuallisiert sich nicht von 
selbst. Meine bisherige Methode ist das ständige öffnen und schließen 
des Ports, was natürlich Zeit kostet die ich gerne einsparen würde.

Kann mir jemand bei meinem Problem helfen?
Würde mich freuen wenn jemand von den Profis mir einen Hinweis oder gar 
die Lösung gibt.


Beste Grüße
Bobo
Gast #2016806
Lesenswert?

Bobo schrieb:
> Jetzt kommt aber das Problem. Der Port aktuallisiert sich nicht von
> selbst. Meine bisherige Methode ist das ständige öffnen und schließen
> des Ports, was natürlich Zeit kostet die ich gerne einsparen würde.

was meinst du mit "Der Port aktuallisiert sich nicht von selbst" kommen 
keine Daten an?

zeigt mal etwas quellcode, dann kan man ja vielleicht sehen wo der 
fehler ist.
Gast #2016818
Lesenswert?

Hallo Peter,


es kommen immer die gleichen Daten an.

Achtung der Programmcode ist recht groß zum darstellen.
(Programmsprache C++, mit Borland Compiler)

//-------------------------------------
// DEFINITIONEN AM ANFANG
// ------------------------------------
// globale Daten
DCB dcb;                  // Device Control Block
HANDLE hCom;              // einfacher Datentyp für Schnittstelle
COMMTIMEOUTS timeouts;    // System abhängige Definition
BOOL fSuccess;            // vordefinierter Datentyp
DWORD BytesRead;          // vordefinierter Datentyp

const int BAUD = 9600;


//-------------------------------------
// FUNKTION ZUM ÖFFNEN
// ------------------------------------
void TUser::PortOeffnen(){
  /* BEGIN des INIT-BLOCKs der seriellen Schnittstelle */

  // Öffnen der Schnittstelle, Definitionen siehe oben!
  hCom = CreateFile(
    ComPort,
    dwDesiredAccess,
    dwShareMode,
    lpSecurityAttributes,
    dwCreationDisposition,
    dwFlagsAndAttributes,
    hTemplateFile
  );

  // direktes Fehler abfangen der CreatFile-Funktion
  PERR(hCom != INVALID_HANDLE_VALUE, "CreateFile");
  if (hCom != INVALID_HANDLE_VALUE){

  // Was liefert GetCommState?
  fSuccess = GetCommState(hCom, &dcb);
  PERR(fSuccess, "GetCommState");

  // COM-Port einrichten --> Device Control Block
  dcb.BaudRate = BAUD;
  dcb.ByteSize = 8;
  dcb.Parity = NOPARITY;
  dcb.StopBits = ONESTOPBIT;
  dcb.fDtrControl = DTR_CONTROL_ENABLE;//DISABLE;
  dcb.fInX = FALSE;

  // Was liefert SetCommState?
  fSuccess = SetCommState(hCom, &dcb);
  PERR(fSuccess, "SetCommState");
  // Was liefert GetCommTimeouts?
  fSuccess = GetCommTimeouts (hCom, &timeouts);
  PERR(fSuccess, "GetCommTimeouts");

  /*
     Set  timeout to  0 to  force that:  If a character is in  the 
buffer, the
     character is read, If no character is in the buffer, the function 
do
     not wait  and returns  immediatly
  */

  timeouts.ReadIntervalTimeout = MAXDWORD;
  timeouts.ReadTotalTimeoutMultiplier = 0;
  timeouts.ReadTotalTimeoutConstant = 0;

  fSuccess = SetCommTimeouts (hCom, &timeouts);
  PERR(fSuccess, "SetCommTimeouts");
  }
  else
    return;
  /* ENDE des INIT-BLOCKs der seriellen Schnittstelle*/

  return;
}

//--------------------------------------------------------------------

Ich hoffe das waren die relevanten Stellen.

BG
Bobo
Gast #2016844
Lesenswert?

Daten einlesen:

//---------------------------------------------------------------------- 
--
if (ReadFile ( hCom, &dateneingang, 1, &BytesRead, NULL)){
      CallRun=true;
      ui_daten = (unsigned int)dateneingang; 
// Daten in unsigned int wandeln;
      if (ui_daten > 255) {
        ui_daten -= 4294967040;
// Berechnet wird der korrekte 8-Bit-Wert
      }

//---------------------------------------------------------------------- 
--

CallRun braucht nicht beachtet werden, dient nur meiner Steuerung.

Also ReadFile liefert keine 0 zurück, da ich damit die IF-Abfrage 
steuere.
Gast #2016862
Lesenswert?

> timeouts.ReadIntervalTimeout = MAXDWORD;
> timeouts.ReadTotalTimeoutMultiplier = 0;
> timeouts.ReadTotalTimeoutConstant = 0;

ich habe jetzt nich genau in der doku nachgelesen, du setzt zwar das 
timeout auf maximum aber den Multiplikator auf 0 -> MAX * 0 = 0

Lass das ändern der Timeouts mal weg, es geht in vielen fällen auch 
ohne.
Gast #2016887
Lesenswert?

Also ich verwende kein BytesRead...
Das mit den TimeOuts werde ich machen.

Habe leider die Schaltung gerade nicht hier um das auszutesten.

Wenn dir nochetwas einfällt wäre eine Mitteilung super.


Kannst du mir ein Buch empfehlen, was auf die Serielle Schnittstelle 
eingeht?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren