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.
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
Danke für die schnelle Antwort, ich probiers mal aus. Dirk.
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.
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
Leitung wird schon auf LOW gezogen aber das empfangen mit der Windows Funktion geht nicht. Dirk.
> 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.
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?
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; } }
Hast Du Dir mal angesehen, wie im Hardwaremanager die Sende- und Empfangs-FIFOs Deiner Schnittstelle konfiguriert sind? Wie hast Du SetCommEventmask aufgerufen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.