mikrocontroller.net

Forum: PC-Programmierung RS232, WinAPI, C


Autor: Faddi Roller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe zwei kleine Programme in C-Code. Das eine baut mit WinAPI ein
Fenster auf mit 3 Buttons. Das andere setzt die Pins RTS und DTR auf 0
oder 1. Jetzt möchte ich diese beiden Programme Verknüpfen, so dass
wenn man auf einen Button klickt jeweils der dazugehörige Pin auf 1
gesetzt wird. Hier der Code:


#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam);

HDC dc;
HWND button1, button2, button3;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow) {
WNDCLASS wc;
HWND hWnd;
MSG msg;
wc.style = CS_HREDRAW|CS_VREDRAW|CS_BYTEALIGNCLIENT;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
/*(HBRUSH)(COLOR_WINDOW+1);*/
wc.lpszMenuName = NULL;
wc.lpszClassName = "ButtonExample";
RegisterClass(&wc);

hWnd = CreateWindow(wc.lpszClassName,"Switch 1.0",
WS_OVERLAPPEDWINDOW,100,100,410,90,
NULL,NULL,hInstance,NULL);

button1 =
CreateWindow("BUTTON","Battery",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
10,10,120,40,hWnd,NULL,hInstance,NULL);
button2 = CreateWindow("BUTTON","Solar",WS_CHILD |WS_VISIBLE|
BS_PUSHBUTTON,
140,10,120,40,hWnd,NULL,hInstance,NULL);
button3 = CreateWindow("BUTTON","OFF",WS_CHILD |WS_VISIBLE|
BS_PUSHBUTTON,
270,10,120,40,hWnd,NULL,hInstance,NULL);

ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
HANDLE hPort;
hPort =  CreateFile (TEXT("COM1"), GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, 0, NULL);

switch(uMsg)
{
case WM_COMMAND:
{
if ((HWND)lParam==button1) {
EscapeCommFunction (hPort, CLRDTR);
EscapeCommFunction (hPort, SETRTS);
MessageBox(hwnd,"Battery ON","Good!",MB_OK); };
if ((HWND)lParam==button2) {
EscapeCommFunction (hPort, CLRRTS);
EscapeCommFunction (hPort, SETDTR);
MessageBox(hwnd,"Solar ON","Better!",MB_OK); }
if ((HWND)lParam==button3) {
EscapeCommFunction (hPort, CLRRTS);
EscapeCommFunction (hPort, CLRDTR);
MessageBox(hwnd,"Energy OFF","",MB_OK); }
return 0;
}

case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
default:
{
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
}
CloseHandle (hPort);

return 0;
}


Das Problem ist, wenn ich das Programm kompiliere, ausführe und dann
einen Button klicke kommt zwar ein Message-Fenster wie vorgesehen aber
die WinAPI-Funktionen "EscapeCommFunction" werden übersprungen. Das
sehe ich daran, dass sich die Spannungen an den Pins nicht ändern. Was
mache ich falsch?

Danke für eure Hilfe im Voraus,

Faddi

Autor: Dr. Nick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Du öffnest die serielle Schnittstelle in WndProc(), d.h. bei jeder
Windows-Nachricht wird COM1 geöffnet (auch beim Neuzeichnen des
Fensters, Mausbewegung...). Besser erstellst du das HANDLE für COM1 in
WinMain() vor "ShowWindow(...);" und schliesst es wieder vor "return
msg.wParam;" Wenn der serielle Port unbedingt gleich nach dem Öffnen
wieder geschlossen werden soll, dann öffne und schliesse ihn innerhalbe
der Klammern von "case WM_COMMAND".

Ich weiss nicht, ob der COM-Port nach dem Schliessen wieder in den
"Urzustand" versetzt wird. Das würde bedeuten, dass Du in WndProc()
RTS und DTR zwar änderst, diese aber am Ende der Funktion wieder den
ursprünglichen Zustand erhalten würden. Also besser den COM-Port am
Programmstart öffnen und am Programmende wieder schliessen wie oben
beschrieben. Das Handle muss dann natürlich als globale Variable
definiert werden.

2. Du prüfst überhaupt nicht, ob der COM-Port geöffnet werden konnte
(ist hPort ein gültiges HANDLE?)! Wenn COM1 durch ein anderes Programm
geöffnet wurde (z.B. Teminal), kannst Du COM1: nicht öffnen.

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.