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


von Patrick B. (p51d)


Angehängte Dateien:

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.

von Peter (Gast)


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!

von Patrick B. (p51d)


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

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Arc N. (arc)


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-05_BaudRates.pdf
(Aliasing Baud Rates)

von Patrick B. (p51d)


Lesenswert?

Rufus t. Firefly schrieb:
> Vermutlich liegt hier das Problem im Programmteil, der mit dem
> geposteten Sourcode zusammenarbeitet; wie wird denn /ComOpen/
> aufgerufen?
1
private: System::Void buttonConnect_Click(System::Object^  sender, System::EventArgs^  e) {      
2
  connect = ~connect;
3
  if(connect){
4
    ComInit();
5
    buttonConnect->Text = "Disconnect";
6
    if(ComOpen(COM1,/*3000000*/57600,P_NONE,S_1BIT,D_8BIT)){
7
      labelStatus->Text = "Comport opened";
8
    }
9
    else{
10
      labelStatus->Text = "Comport couldn't opened";
11
    }
12
  }
13
  else{
14
    ComClose(COM1);
15
    ComExit();
16
    labelStatus->Text = "Comport closed";
17
    buttonConnect->Text = "Connect";
18
  }
19
}
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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Arc N. (arc)


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
1
memset(&sDcb,0,sizeof(sDcb));
2
sDcb.DCBlength=sizeof(sDcb);
3
...
den DCB zuerst vom System/Treiber ausfüllen lassen und dann die 
entsprechenden Parameter setzen
1
memset(&sDcb, 0, sizeof(sDcb));
2
sDcb.DCBlength = sizeof(DCB);
3
if (!GetCommState(hFile, &sDcb)) {
4
    CloseHandle(hFile);
5
    return 0;
6
}
7
...
8
if(!SetCommState(hFile,&sDcb)) { 
9
   ...

von Patrick B. (p51d)


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.
1
memset(&sDcb,0,sizeof(sDcb));
2
sDcb.DCBlength=sizeof(sDcb);
3
4
if (!GetCommState(hFile, &sDcb)) {
5
    CloseHandle(hFile);
6
    return 0;
7
}
8
9
10
sDcb.BaudRate       = Baud;
11
sDcb.fParity        = (Parity!=0)? TRUE:FALSE;
12
sDcb.fBinary        = TRUE;
13
sDcb.Parity         = iPMode[Parity];
14
sDcb.StopBits       = iSMode[Stopbits&3];
15
sDcb.fOutxCtsFlow   = FALSE;
16
sDcb.fOutxDsrFlow   = FALSE;
17
sDcb.fDtrControl  = DTR_CONTROL_ENABLE;
18
sDcb.fRtsControl  = RTS_CONTROL_ENABLE;
19
sDcb.fDsrSensitivity= FALSE;
20
sDcb.fAbortOnError  = FALSE;
21
sDcb.ByteSize       = (Databits)? 8:7;
22
23
if(!SetCommState(hFile,&sDcb)){
24
  CloseHandle(hFile);
25
  return 0;
26
}
27
28
29
sTo.ReadIntervalTimeout       = MAXDWORD;     // 0 ms Read-Tomeout
30
sTo.ReadTotalTimeoutMultiplier = 0;
31
sTo.ReadTotalTimeoutConstant   = 0;
32
sTo.WriteTotalTimeoutMultiplier= 12000/Baud+1;  // ? ms Write timeout per byte
33
sTo.WriteTotalTimeoutConstant  = sTo.WriteTotalTimeoutMultiplier+1;
ist das etwas das, wie ich es machen soll?

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.