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.
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!
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
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?
Rufus t. Firefly schrieb:
> Vermutlich liegt hier das Problem im Programmteil, der mit dem> geposteten Sourcode zusammenarbeitet; wie wird denn /ComOpen/> aufgerufen?
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.
@ 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
return0;
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
return0;
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