www.mikrocontroller.net

Forum: PC-Programmierung Serielle Schnittstelle


Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar,


Danke für die schnelle Antwort.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.