Forum: PC-Programmierung Serielle Schnittstelle


von Bobo (Gast)


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

von Peter (Gast)


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.

von Bobo (Gast)


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

von Peter (Gast)


Lesenswert?

und wo ist das lesen der schnittstelle? Wenn du den Timeout auf 0 setzt 
dann liefer vermutlich read als anzahl meist 0 zurück und du verwendest 
du alten daten, kann das sein?

von Bobo (Gast)


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.

von Peter (Gast)


Lesenswert?

verwendest du denn BytesRead? Dort steht drin wie viele bytes er gelesen 
hat, wenn dort 0 steht dann wurde nicht gelesen und die funktion war 
drozdem erfolgreich.

von Peter (Gast)


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.

von Bobo (Gast)


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?

von Peter (Gast)


Lesenswert?

Bobo schrieb:
> Kannst du mir ein Buch empfehlen, was auf die Serielle Schnittstelle
> eingeht?

nein, denn ich finde die MSND-Doku mehr als ausreichend. Aber man sollte 
lieber nicht die Deutsche version verwenden, weil sie teilweise 
unvollständig ist.

von Bobo (Gast)


Lesenswert?

Alles klar,


Danke für die schnelle Antwort.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.