Com Programmierung mit LOW Level Programmierung

Gast #199165
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.
Gast #199168
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.
Gast #199169
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
Gast #199171
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.
Gast #199172
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?
Gast #199173
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;
        }
    }
Gast #199175
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren