www.mikrocontroller.net

Forum: PC-Programmierung comtools Baudrate höher als 57600?


Autor: Patrick B. (p51d)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinander.

Ich bin dabei eine kleine Windows-Umgebung für ein Projekt zu machen, 
welches ich schon früher gebaut habe (MCU mit FT232) und nun wollte ich 
eigentlich eine Baudrate von 3000000 einstellen, doch comtools 
unterstützt irgendwie nur eine bis 57600 und nicht höher.

Aus Tests mit Hyperterminals weiss ich, dass die Kommunikation 
eigentlich läuft.

Des weiteren macht das keinen Sinn, dass keine Baudrate höher als 57600 
gehen, denn dies ist nicht einmal eine 16-Bit Variable, und da das ganze 
auf Windows-Ebene auf 32Bit gerechnet wird, sollte eigentlich die grösse 
nicht das Problem sein
Kann mir da jemand einen Rat geben??

MFG
Patrick


Damit ihr nicht lange suchen müsst habe ich die CPP-Datei von Comtools 
gleich angehängt.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein PC schafft normalerweise eine Baudrate von maximal 115200 Baud. 
Jedoch viele USB-UART Converter gehen bis rund 921600 Baud.

Aber für 3000000 Baud wirst Du wohl kaum was finden!

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
den FT232Rl geht bis 3MBaud, der FT245 hat MCU-Seitig keine Begrenzung, 
da die Daten Parallel eingelesen werden.

Getestet habe ich meine Schaltung mit hterm und Docklight, beides 
Therminals und die schaften die 3MB ohne weiteres beim selben PC, da die 
Daten über einen VCP Treiber via USB an den USB-RS232 Wandler geschickt 
werden.

Des weiteren haben hier im Forum ein paar Leute ihre Schaltungen mit 
einem Java-PC-Programm betrieben und das mit 4,8MByte Baud!!!

von demher muss es gehen, das Problem ist wohl einfach bei der 
comtools.cpp Datei

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch der Sourcecode ist nicht Ursache des Problemes. In dcb.baud kann 
der Wert der gewünschten Baudrate eingetragen werden.

Welche Baudrate dann verwendet wird, hängt vom Devicetreiber und der 
Hardware ab; die Onboard-Schnittstellen des PCs können nicht mehr als 
115200 Baud.

Vermutlich liegt hier das Problem im Programmteil, der mit dem 
geposteten Sourcode zusammenarbeitet; wie wird denn ComOpen 
aufgerufen?

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilft alles nichts, kann man zur Not auch beim FTDI-Treiber einstellen, 
dass, wenn z.B. 57600 vom Programm angefordert werden, 3 MBit/s 
rauskommen.
http://www.ftdichip.com/Documents/AppNotes/AN232B-...
(Aliasing Baud Rates)

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Vermutlich liegt hier das Problem im Programmteil, der mit dem
> geposteten Sourcode zusammenarbeitet; wie wird denn /ComOpen/
> aufgerufen?
private: System::Void buttonConnect_Click(System::Object^  sender, System::EventArgs^  e) {      
  connect = ~connect;
  if(connect){
    ComInit();
    buttonConnect->Text = "Disconnect";
    if(ComOpen(COM1,/*3000000*/57600,P_NONE,S_1BIT,D_8BIT)){
      labelStatus->Text = "Comport opened";
    }
    else{
      labelStatus->Text = "Comport couldn't opened";
    }
  }
  else{
    ComClose(COM1);
    ComExit();
    labelStatus->Text = "Comport closed";
    buttonConnect->Text = "Connect";
  }
}
Die Funktionen rufe ich so auf, wie es in comtools.cpp beschrieben ist, 
und in comtoolsDEMO.cpp ist noch ein Beispiel, wie das ganze laufen 
sollte.


Arc Net schrieb:
> Hilft alles nichts, kann man zur Not auch beim FTDI-Treiber einstellen,
> dass, wenn z.B. 57600 vom Programm angefordert werden, 3 MBit/s
> rauskommen.
> http://www.ftdichip.com/Documents/AppNotes/AN232B-...
> (Aliasing Baud Rates)

Danke für den Vorschlag, nur habe ich das gefühl dass dies nicht 
unbedingt eine saubere Lösung des Problems ist.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist ja 3 MBit Baudrate doch mehr als der VCP-Treiber von FTDI 
zulässt? Mal in dessen Programmierdokumentation reingesehen?

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
U.U. nochmal folgendes testen (bin im Moment zu faul die alten Docs 
rauszusuchen, um nachzusehen, warum das so gemacht wurde):
In ComTools.cpp statt
memset(&sDcb,0,sizeof(sDcb));
sDcb.DCBlength=sizeof(sDcb);
...
den DCB zuerst vom System/Treiber ausfüllen lassen und dann die 
entsprechenden Parameter setzen
memset(&sDcb, 0, sizeof(sDcb));
sDcb.DCBlength = sizeof(DCB);
if (!GetCommState(hFile, &sDcb)) {
    CloseHandle(hFile);
    return 0;
}
...
if(!SetCommState(hFile,&sDcb)) { 
   ...

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rufus t. Firefly
ok, dies ist eine Möglichkeit, zwar keine logische, aber immerhin.
denn wenn der VCP Treiber nicht 3MBaud unterstützen würde, hätte das nie 
mit einem anderen Terminal funktioniert, und dann ist auch noch die 
maximale Grösse von 57600 als Baud, was keinen sinn ergibt.

Ich weiss nicht mehr ganz genau, wie viel der VCP-Treiber unterstützt, 
aber das werde ich noch nachschauen...

@Arc Net
Da ich leider erst so ein wenig angefangen habe mit C++ habe ich den 
Sinn nicht ganz begriffen, für was dass das gut sein soll, und wie ich 
das im Code schreiben muss.
memset(&sDcb,0,sizeof(sDcb));
sDcb.DCBlength=sizeof(sDcb);

if (!GetCommState(hFile, &sDcb)) {
    CloseHandle(hFile);
    return 0;
}


sDcb.BaudRate       = Baud;
sDcb.fParity        = (Parity!=0)? TRUE:FALSE;
sDcb.fBinary        = TRUE;
sDcb.Parity         = iPMode[Parity];
sDcb.StopBits       = iSMode[Stopbits&3];
sDcb.fOutxCtsFlow   = FALSE;
sDcb.fOutxDsrFlow   = FALSE;
sDcb.fDtrControl  = DTR_CONTROL_ENABLE;
sDcb.fRtsControl  = RTS_CONTROL_ENABLE;
sDcb.fDsrSensitivity= FALSE;
sDcb.fAbortOnError  = FALSE;
sDcb.ByteSize       = (Databits)? 8:7;

if(!SetCommState(hFile,&sDcb)){
  CloseHandle(hFile);
  return 0;
}


sTo.ReadIntervalTimeout       = MAXDWORD;     // 0 ms Read-Tomeout
sTo.ReadTotalTimeoutMultiplier = 0;
sTo.ReadTotalTimeoutConstant   = 0;
sTo.WriteTotalTimeoutMultiplier= 12000/Baud+1;  // ? ms Write timeout per byte
sTo.WriteTotalTimeoutConstant  = sTo.WriteTotalTimeoutMultiplier+1;
ist das etwas das, wie ich es machen soll?

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.