www.mikrocontroller.net

Forum: PC-Programmierung Com Programmierung mit LOW Level Programmierung


Autor: Dirk Lantzsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche eine Com Verbindung zum Mega128 aufzubauen. Dies muss aber ohne
Windows Funktionen passieren, da ich die DTR und RTS Leitung zum
anschalten eines Netzteiles benutze. Das senden an den µC funktioniert
mit vollen 115200 Baud. Aber beim empfangen bekomme ich auch bei 9600
Baud einen Frame Error, jedoch erst später als bei 115200 Baud. Wenn
ich aber an ein fertiges Windows Terminal schicke dann klappt das
wunderbar. Habe schon wie ein verrückter gegoogelt und auch dieses
Forum schon durchsucht, aber bisher keine Erfolge erziehlt.

Hat schon mal jemand sowas programmiert. Aber ohne Windows Funktionen!
Also mit eigenem dynamisch geladenem Treiber.
Benutze WinXP und Borland C++.

Danke,
Dirk.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich weiss zwar nicht, welche "Windows Funktionen" Du verwendest, aber
bei denen:

http://msdn.microsoft.com/library/default.asp?url=...

ist alles beim Öffnen eines Com-Ports konfigurierbar, auch
DTR-Disable.



Grüße
Oliver

Autor: Dirk Lantzsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort,
ich probiers mal aus.

Dirk.

Autor: Dirk Lantzsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert nicht. Trotz Software(Windows API) mässiger Abschaltung
werden die DTR und RTS Leitungen beim senden und empfangen mit der
Windows Funktion geschaltet. Ich glaube die werden dann einfach
Software mässig nicht beachtet und nicht wirklich deaktiviert.
Hat nicht jemand mal ohne Windows Funktion, also mit Hardware Treiber,
die Serielle programmiert?

Dirk.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

hast Du das in etwa so probiert:
...
setDCB.ByteSize      = 8;
setDCB.Parity      = NOPARITY;
setDCB.StopBits      = ONESTOPBIT;
setDCB.fBinary      = TRUE;
setDCB.fDtrControl    = DTR_CONTROL_DISABLE;
setDCB.fParity      = FALSE;
setDCB.fRtsControl    = RTS_CONTROL_DISABLE; //RTS_CONTROL_ENABLE
setDCB.fOutxCtsFlow    = FALSE;
setDCB.fOutxDsrFlow    = FALSE;
setDCB.fDsrSensitivity  = FALSE;


Und es ging nicht??? Oh ha, da kann ich mich wohl in Zukunft auch mit
diesem Problem rumschlagen. Sch**** Windows, das Programme auf WinXYZ
laufen und auf WinABC nicht so richtig, habe ich auch schon feststellen
müssen :-(

Grüße
Oliver

Autor: Dirk Lantzsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leitung wird schon auf LOW gezogen aber das empfangen mit der Windows
Funktion geht nicht.

Dirk.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Trotz Software(Windows API) mässiger Abschaltung
> werden die DTR und RTS Leitungen beim senden und
> empfangen mit der Windows Funktion geschaltet

Das lässt darauf schließen, daß Du das Hardwarehandshake nicht
deaktiviert hast - das ist aber erforderlich, wenn Du's selbst machen
willst.

Hier sind diese Zeilen aus Olivers Posting relevant:

setDCB.fDtrControl    = DTR_CONTROL_DISABLE;
setDCB.fRtsControl    = RTS_CONTROL_DISABLE;
setDCB.fOutxCtsFlow    = FALSE;
setDCB.fOutxDsrFlow    = FALSE;

> Hat nicht jemand mal ohne Windows Funktion, also mit
> Hardware Treiber, die Serielle programmiert?

Das ist unter Windows nur mit einem Devicetreiber möglich. Warum aber
das Rad zweimal erfinden - Windows spricht ja die serielle
Schnittstelle auch über einen Devicetreiber an, und der funktioniert
...
Wenn man die Win32-API-Funktionen richtig verwendet, dann macht die
Schnittstelle auch genau das, was man von ihr möchte. Zugegeben, die
Dokumentation der entsprechenden Funktionen ist nicht die beste, aber
der Versuch, an Windows vorbei mit der Schnittstelle zu kommunizieren,
ist keine Lösung.

Einerseits würde so ein Ansatz nur mit der Standardhardware
(Onboard-Schnittstellen), nicht aber mit zusätzlichen Schnittstellen
auf PCI-Karten oder USB-Adaptern funktionieren, andererseits ist er
auch sehr kompliziert - einen funktionierenden Devicetreiber schreibt
man nicht mal eben so, das schaffen ja selbst die Hardwarehersteller
nicht oder nur mit Mühen.

Nee - lies Dir die Dokumentation der Win32-API-Funktionen noch mal
genauer durch; es gibt ausreichend Tutorials etc.

Autor: Dirk Lantzsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal Danke für eure Hilfe,
jetzt scheint es zu klappen(windows Api), muss es mal noch an nem
anderen PC ausprobieren. Habs nochmal komplett neu geschrieben. Hatte
sich wohl der Fehlerteufel, durch 4 Tage hin und her probieren,
eingeschlischen.

Nochaml Danke,
Dirk.


PS: rein interesse halber, wie sieht sowas dann unter LINUX aus?

Autor: Dirk Lantzsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Empfangen will einfach nicht funktionieren, bei "kleinen"
Datenmengen (~100 Byte) funktionierts, wenn Datenmenge > 100 Byte
bleibt mein Programm in der WaitCommEvent-Funktion hängen. Bei einem
Terminalprogramm funktionierts.

 for( ; ; )
    {
        if(WaitCommEvent(hComm, &dwCommEvent, NULL))
        {
            if(ReadFile(hComm, &chRead, 1, &dwRead, NULL))
              pRead[a++] = chRead;
            if(chRead ==  4)
                break;
        }
    }

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du Dir mal angesehen, wie im Hardwaremanager die Sende- und
Empfangs-FIFOs Deiner Schnittstelle konfiguriert sind?

Wie hast Du SetCommEventmask aufgerufen?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich selbst verwende gar nicht WaitCommEvent(). Polle einfach die
Schnittstelle byteweise. Mit den Timeouts stelle ich die "Dynamik"
ein.
Wenn (dwRead == 0) ist entweder gar nichts gekommen oder Telegramm
wurde vollständig empfangen.


Grüße
Oliver

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.