mikrocontroller.net

Forum: PC-Programmierung Com Port initialisierung klappt nicht


Autor: Pat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe mit meinem Programm ein Problem. Und zwar funktioniert die 
Kommunikation über die serielle Schnittstelle erst nachdem ich den Port 
mit Hyperterminal oder ähnlichem kurz geüffnet habe.

so initialisiere ich den Port:
Aufruf zu beginn der main:


port_initialisieren("COM1",38400,8,1);
#include <windows.h>

#define  DTR  0
#define  RTS  1

HANDLE    hCom;
static int   dtr_last_state=1,rts_last_state=1;

/************************************************************************************************/

void port_initialisieren(char port_name[],DWORD baudrate,BYTE byte_groesse,BYTE anz_stopbits)
{
  DCB    interface_parameter;
  COMMTIMEOUTS  timeout_einstellungen;

  hCom=CreateFile(  port_name,
        GENERIC_READ|GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);

  GetCommState(hCom,&interface_parameter);
  interface_parameter.DCBlength=sizeof(interface_parameter);
  interface_parameter.BaudRate=baudrate;
  interface_parameter.ByteSize=byte_groesse;
  interface_parameter.StopBits=anz_stopbits;
  interface_parameter.Parity=NOPARITY;
  SetCommState(hCom,&interface_parameter);

  timeout_einstellungen.ReadIntervalTimeout=100;
  timeout_einstellungen.ReadTotalTimeoutMultiplier=100;
  timeout_einstellungen.ReadTotalTimeoutConstant=100;
  timeout_einstellungen.WriteTotalTimeoutMultiplier=100;
  timeout_einstellungen.WriteTotalTimeoutConstant=100;
  SetCommTimeouts(hCom,&timeout_einstellungen);

  EscapeCommFunction(hCom,CLRDTR);
  EscapeCommFunction(hCom,CLRRTS);
}

was stimmt daran nicht oder fehlt??
bin leider nicht soo der C Freak

habe das ganze mit Dec C++ gemacht

Hoffe ihr könnt mir helfen, denn das Programm sollte nach dem 
Systemstart automatisch anspringen, nur so geht das nicht.

Gruß Pat

Autor: Blackbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Zweifelsfall immer den Return code ansehen/auswerten:
  if (hCom == INVALID_HANDLE_VALUE)
  {
    LPVOID lpMsgBuf;
    FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | 
      FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
      NULL, GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
      (LPTSTR) &lpMsgBuf, 0, NULL);
    MessageBox (NULL, (LPCTSTR)lpMsgBuf, TEXT("ComThread: error: CreateFile()"), 
      MB_OK | MB_ICONINFORMATION);
    LocalFree (lpMsgBuf);
  }

Und statt
  interface_parameter.BaudRate=baudrate;
  interface_parameter.StopBits=anz_stopbits;
diese Einstellungen verwenden (aus den headern):
  interface_parameter.BaudRate=CBR_9600;
  interface_parameter.StopBits=ONESTOPBIT;
Und die Timeouteinstellungen so setzen:
ReadIntervalTimeout ist die Warte-Zeit [ms] vom Beginn eines Bytes bis 
zum Beginn des nächsten Bytes (kann aus den Einstellungen ByteSize, 
Baudrate und StopBits abgeleitet werden).
ReadTotalTimeoutMultiplier (z.B. = 0) in [ms] wird mit Read-Buffer-Size 
multipliziert.
ReadTotalTimeoutConstant (z.B. = 50), wird an ReadTotalTimeoutMultiplier 
angehängt.
Die anderen Werte können 0 sein.

Das könnte noch fehlen:
  SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE); // irgendein Wert > 0

Hyperterm und ä. initialisieren die Ports (richtig) und die 
Einstellungen bleiben nach dem Beenden dieser Programme im Kernel 
erhalten. Deshalb funktioniert Dein Programm nach dem Starten von 
Windows VOR dem Starten von Hyperterm o.ä. nicht.


Blackbird

Autor: Blackbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, GetCommTimeouts() verwenden holt die aktuellen Einstellungen.

Blackbird

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.