Hi,
ich habe ein merkwürdiges Problem mit meiner seriellen Schnittstelle.
Nachdem mein PC hochgefahren ist, muss ich immer einmal Hyperterminal
starten, damit mein C++ Programm funktioniert. Dann funktioniert aber
mein C++ programm solange bis ich den PC neu starte. Daher vermute ich,
dass es am Init der Schnittstelle liegt.
Meine Init (aus dem C++ Forum):
laden mal voher die alten einstellungen mit
GetCommState
(gleich nach DCB dcb; )
dann änderst du wie werte wie du es jetzt machst, und dann wieder
speichern mit SetCommState
evi schrieb:> if((int)this->m_hPort == -1) //COMx ist nicht vorhanden> this->m_hPort=0;> if(this->m_hPort !=0)> {
Anstelle dieser merkwürdigen Konstruktion könnte Dir,
je nach dem in welcher Umgebung du deine Objekt laufen lässt,
der folgende Code hilfreich sein:
1
if(m_hPort==INVALID_HANDLE_VALUE)
2
{
3
error=GetLastError();
4
switch(error)
5
{
6
case2:
7
sprintf(str,"Open(%s) not exist.\n",device);
8
break;
9
case5:
10
sprintf(str,"Open(%s) Access is denied (is open).\n",device);
hi,
danke schonmal für die ganzen antworten.
@Peter II: welche alten einstellungen meinst du?
@Volker: Habe ich probiert hat aber leider nicht geholfen :-( trotzdem
danke.
Mit fehler meine ich: Ich schicke daten von meinem PC los, nur leider
reagiert die Schaltung nicht. Wenn ich dann Hyperterminal starte und
daten schicke, kommen die bei der Schaltung an. Danach starte ich mein
Programm wieder und dann kommen auch dessen daten an.
Wenn ich beide programm gleichzeitig starte beschweren sie sich auch,
dass der Port schon belegt ist.
Außerdem habe ich auch nochmal deine Fehlerabfrage eingefügt, aber sie
wird garnicht erst aufgerufen. Mein Programm scheint auch überall die
richtigen Abzweigungen zu nehmen. Ich habe bei mir noch einige TRACE
anweisungen eingefügt und weiß daher, dass alle Bedingungen erfüllt
werden.
danke schonmal für die Hilfe
habt ihr noch ideen woran es liegen könnte??
evi schrieb:> @Peter II: welche alten einstellungen meinst du?
die vom System vorgeben sein. Du legst mit DCB dcb; eine leere konfig
an. Ich lese danach immer zu erst die aktuellen Daten aus und ändere
dann nur. Da du aber bei 0 anfängst und eventuell einen Wert vergisst zu
setzen kann das zu diesen effekt führen.
> Mit fehler meine ich: Ich schicke daten von meinem PC los, nur leider> reagiert die Schaltung nicht.
Also das Öffnen des Ports geht ohne Fehler und Du kannst senden?
Wie hast Du das verifiziert?
Was ist der Rückgabewert von WriteFile(...) ?
Wenn du Senden kannst (im richtigen Format), liegt der Fehler nicht beim
Öffnen des Ports.
Sicherheitshalber würde ich aber noch die beiden Funktionen
@Peter II: okay macht sinn. Leider weiß ich nicht genau, wie ich die
Systemeinstellungen auslese (sorry bin noch anfänger). Könntest du mir
da nochmal einen tip geben. Danke
@Dirk: ich verwende ein USB Kabel. Signalkette ist so:
PC( mit Virtual com treiber) -> USB Kabel-> ft232-> µC. Müsste
eigentlich klappen. Ich kann ja auch daten senden, nur leider nicht von
anfang an ;-).
@Rufus: ich habe die Zeilen von dir eingefügt. hat aber leider zu keiner
verbesserung bei getragen.
@ Volker: also das Problem ist halt nur das sende bevor ich einmal das
Hyperterminal gestarte habe. Einmal Hyperterminal benutzt, danach kann
ich wieder mein c++ programm öffnen und solange und soviele daten
schicken wie ich will. Die kommen auch richtig bei der Schaltung an.
daher gehe ich davon aus, dass das hyperterminal noch irgendwas
einstellt oder macht, was ich vergessen habe. oder das ich an einer
stell einen fehler habe.
Habt ihr noch irgendeine idee woran es liegen könnte?
lg evi
Wird sich schon finden ! Aber du kannst doch auch die DLL von FTDI
benutzen dann kannste dir das Comport Progen sparen. Die hat noch
zusätliche Features und kann zum Beispiel auch Baudraten einstellen wie
3141592 Baud auch kann man dann das Gerät über den Namen öfnen und
braucht sich nicht um die von Windows vergebene Commport Nummer zu
kümmern.
http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide%28FT_000071%29.pdf
@volker: also das Programm läuft eigentlich. Nur wenn ich den Pc
neustarte und probiere daten zu senden kommen die nicht an (schaltung
macht nichts). Wenn ich dann Hyperterminal starte, eine Verbindung mit
der Schaltung herstelle und danach wieder Hyperterminal beende, dann
kann ich danach auch mit meinem c++ programm daten senden. sooft und
solange ich will. Ich kann zwischendurch auch die Schaltung ausschalten
und wieder an, es funktioniert immer. Wenn ich den Pc neustarte
funktioniert es wieder nicht.
Daher denke ich, dass ich bei der Schnittstelle irgendwas vergessen habe
zu setzen.
habe das programm im debugger laufen. werde mal gucken ob ich irgendwas
mit breakpoints rausfinde.
habt ihr sonst noch ideen?
evi schrieb:> @Rufus: ich habe die Zeilen von dir eingefügt. hat aber leider zu keiner> verbesserung bei getragen.
1
dcb.DCBlength=28;
Mach das weg. Das ist aus zweierlei Gründen falsch: Einerseits, was ist
28? Andererseits ist, wenn Du vor dem Aufruf von GetCommState die
Struktur richtig initialisierst, dieses Feld sowieso auf den korrekten
Wert gesetzt.
Uwe schrieb:> Benutz die DLL
Also nicht das Problem lösen, sondern es umgehen?
Halt ich nicht für einen sinnvollen Ansatz.
evi schrieb:> @rufus: habe ich schon nach deinem ersten beitrag gemacht.
Dann poste doch bitte mal den aktuellen Stand Deines Codes. Es ist ja
nicht so, daß es nicht möglich ist, eine serielle Schnittstelle unter
Windows zu nutzen, das haben schon ganz andere hinbekommen.
und gewöhn dir an, die Returnwerte der Funktionen auszuwerten.
Wenn, wie im Falle von SetCommState die Funktion einen BOOL zurückgibt,
dann reicht es schon, wenigstens eine MessageBox mit "Fehler" drinn
auszugeben, wenn die Funktion FALSE liefert.
Wer Returnwerte ignoriert bzw in einer Debug Version nicht wenigstens
meldet (und sei es nur mit einem ASSERT, so dass der Debugger stehen
bleibt) und hinterher jammert, dass nichts funktioniert, kriegt von mir
kein Mitleid. Er kriegt höchstens ein mitleidiges Lächeln gepaart mit
einem "selber Schuld wenn du stundenlang Fehler suchst"
Uwe schrieb:> Nö ist einfach eleganter mit dll.
woher weisst du überhaupt das es ein FTDI umsetzer ist? Es gibt auch
leute die habe noch eine echte COM-Schnittstelle.
Uwe schrieb:> Nö ist einfach eleganter mit dll.
Ist es überhaupt nicht, weil damit nur die von der DLL unterstützten
USB-Seriell-Bridges verwendbar sind, nicht aber serielle Schnittstellen
allgemein.
Solange nicht irgendwelche Spezialiäten betrieben werden, die zwingend
auf Funktionen der FTDI-Bausteine zugreifen (Auslesen der Seriennummer,
Ansteuern der MPSSE oder Bitbanging), ist es definitiv nicht ratsam,
die DLL zu nutzen.
Und die Hoffnung, daß der Threadstarter hier seine
7287884731894789234ste Implementierung der Ansteuerung serieller
Schnittstellen über die Win32-API noch richtig auf die Beine bekommt,
die will ich noch nicht aufgeben.
Wenn es dir nicht zu aufwendig ist, installiere doch mal die freie
Version von Serialport Monitor und schaue mal deinem Programm und
Hyperterminal über die Schulter.
Das hat bei mir auch schon bei manchen Problemen geholfen.
Möglich das vielleicht einfach nur was am Protokoll nicht richtig
eingestellt ist.
Gruß Dennis