Forum: PC-Programmierung Com Port initialisierung klappt nicht


von Pat (Gast)


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);
1
#include <windows.h>
2
3
#define  DTR  0
4
#define  RTS  1
5
6
HANDLE    hCom;
7
static int   dtr_last_state=1,rts_last_state=1;
8
9
/************************************************************************************************/
10
11
void port_initialisieren(char port_name[],DWORD baudrate,BYTE byte_groesse,BYTE anz_stopbits)
12
{
13
  DCB    interface_parameter;
14
  COMMTIMEOUTS  timeout_einstellungen;
15
16
  hCom=CreateFile(  port_name,
17
        GENERIC_READ|GENERIC_WRITE,
18
        0,
19
        NULL,
20
        OPEN_EXISTING,
21
        0,
22
        NULL);
23
24
  GetCommState(hCom,&interface_parameter);
25
  interface_parameter.DCBlength=sizeof(interface_parameter);
26
  interface_parameter.BaudRate=baudrate;
27
  interface_parameter.ByteSize=byte_groesse;
28
  interface_parameter.StopBits=anz_stopbits;
29
  interface_parameter.Parity=NOPARITY;
30
  SetCommState(hCom,&interface_parameter);
31
32
  timeout_einstellungen.ReadIntervalTimeout=100;
33
  timeout_einstellungen.ReadTotalTimeoutMultiplier=100;
34
  timeout_einstellungen.ReadTotalTimeoutConstant=100;
35
  timeout_einstellungen.WriteTotalTimeoutMultiplier=100;
36
  timeout_einstellungen.WriteTotalTimeoutConstant=100;
37
  SetCommTimeouts(hCom,&timeout_einstellungen);
38
39
  EscapeCommFunction(hCom,CLRDTR);
40
  EscapeCommFunction(hCom,CLRRTS);
41
}

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

von Blackbird (Gast)


Lesenswert?

Im Zweifelsfall immer den Return code ansehen/auswerten:
1
  if (hCom == INVALID_HANDLE_VALUE)
2
  {
3
    LPVOID lpMsgBuf;
4
    FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | 
5
      FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
6
      NULL, GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
7
      (LPTSTR) &lpMsgBuf, 0, NULL);
8
    MessageBox (NULL, (LPCTSTR)lpMsgBuf, TEXT("ComThread: error: CreateFile()"), 
9
      MB_OK | MB_ICONINFORMATION);
10
    LocalFree (lpMsgBuf);
11
  }

Und statt
1
  interface_parameter.BaudRate=baudrate;
2
  interface_parameter.StopBits=anz_stopbits;
diese Einstellungen verwenden (aus den headern):
1
  interface_parameter.BaudRate=CBR_9600;
2
  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:
1
  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

von Blackbird (Gast)


Lesenswert?

Ach ja, GetCommTimeouts() verwenden holt die aktuellen Einstellungen.

Blackbird

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.