Forum: PC-Programmierung Com Programmierung mit LOW Level Programmierung


von Dirk Lantzsch (Gast)


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.

von Oliver (Gast)


Lesenswert?

Hi,

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

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp

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



Grüße
Oliver

von Dirk Lantzsch (Gast)


Lesenswert?

Danke für die schnelle Antwort,
ich probiers mal aus.

Dirk.

von Dirk Lantzsch (Gast)


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.

von Oliver (Gast)


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

von Dirk Lantzsch (Gast)


Lesenswert?

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

Dirk.

von Rufus T. Firefly (Gast)


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.

von Dirk Lantzsch (Gast)


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?

von Dirk Lantzsch (Gast)


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;
        }
    }

von Rufus T. Firefly (Gast)


Lesenswert?

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

Wie hast Du SetCommEventmask aufgerufen?

von Oliver (Gast)


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

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.