Forum: PC-Programmierung FTDI & MATLAB 1Mbit/s


von Robert B. (robert_b36)


Lesenswert?

Hallo zusammen,

Ich plane, einen FT232RL einzusetzen und würde gerne aus MATLAB heraus 
Daten in Echtzeit auf den Controller streamen. gefordert wären so ca. 
1MBit/s. Der FT232 kann ja lt. DB bis 3MBit/s. Das würde also schon mal 
gehen. Meine Frage wäre, ob jemand schon mal aus MATLAB heraus mit einem 
COM-Port und einer Übertragungsrate von 1MBit/s gearbeitet hat? Der 
FTDI-Treiber sollte diese Baudrate ja eigentlich unterstützen, wenn der 
Chip es tut, oder?

Ich weiß, dass es andere Möglichkeiten gibt, das außerhalb von MATLAB zu 
lösen, wäre aber schön, wenn es direkt in MATLAB gehen würde.

VG
Robert

von Uwe (Gast)


Lesenswert?

> Daten in Echtzeit auf den Controller streamen
Vergiss das mal gleich wieder. Für Echtzeit braucht man ein Echtzeit OS.
Läuft dein MathLab auf nem Realtime OS ?

zu USB:
- ist nicht Echtzeitfähig auch wenn du ein Realtime OS laufen hast
- Isochroner Transfer hat zumindest eine garantierte Datenrate aber 
keine Fehlerkorrektur
- Interrupt-Transfer hat Fehlerkorrektur und ist teilweise 
deterministisch da bei Übertragungsfehlern nur 3 mal wiederholt wird.

von Dominik S. (dasd)


Lesenswert?

Uwe schrieb:
> Vergiss das mal gleich wieder. Für Echtzeit braucht man ein Echtzeit OS.

Spricht er hier von "echter" Echtzeit oder von "Echtzeit" im 
umgangssprachlichen Gebrauch (also im Sinne von kontinuierlich bzw. das 
was aus MATLAB rauskommt sofort auf den µC senden).
Denke mal nicht, dass er tatsächlich harte Echtzeitanforderungen stellt 
(oder doch?).

von Robert B. (robert_b36)


Lesenswert?

Hallo zusammen,

danke erstmal für eure Antworten. Das hätte ich genauer erläutern 
müssen. Also es geht eigentlich lediglich um einen kontinuierlichen 
Stream von etwa 1MBit/s, also eher der umgangssprachliche Gebrauch. Der 
Controller soll die Daten mit einer fixen Samplerate auf mehreren DACs 
ausgeben. So der Plan. Fehlerkorrektur spielt erstmal keine Rolle.

Ich denke eigentlich schon, dass über USB ein zuverlässiger Stream von 
1MBit/s möglich sein sollte oder? Vom Prinzip her ist schon klar, dass 
USB an sich nicht echtzeitfähig ist, aber ich denke 1MBit/s über einen 
virtuellen COM-Port sollte möglich sein, sofern solche Übertragungsraten 
eben von MATLAB unterstützt werden, was zurück zur ursprünglichen Frage 
führt. Hat das schon mal jemand gemacht?

VG
Robert

von Uwe (Gast)


Lesenswert?

Wenn kein anderes Gerät am USB dran ist, also auch keine Maus keine 
Tastatur USB-Stick usw. KÖNNTE es EVENTUELL, VIELEICHT klappen.
Weil jedes Gerät Frames zugeordnet bekommt.
Also:

1. FTDI ist dran und empfängt 512 Bytes in 1ms und ab in Puffer (FIFO) 
und mit 1Mbit auf RS232 ausgeben
2. Maus ist dran und Sendet nen Paar Bytes dauert auch 1ms (oder 
Länger!)
3. Tastartur ist dran ...
4. Explore guckt auf USB Stick ... oder was auch immer
--- so wenn hier jetzt mehr als 5,12ms vergangen sind gibs nen aussetzer 
am RS232 Stream
5. FTDI ist wieder dran ...

Also Kaugummie in alle anderen Ports und hoffen das Windows gerade 
nichts besseres zu tun hat als sich um USB zu kümmern.

Isochron kann FTDI nicht !
Nur Bulk wenn ich mich nicht täusche.

von TestX .. (xaos)


Lesenswert?

benutzt auf KEINEN fall die VCP treiber und das matlab serial 
zeug..totlangsam....
die nativen ftdi treiber sind da pflicht

von Martin K. (skiko)


Lesenswert?

> die nativen ftdi treiber sind da pflicht

Das Ganze würde mich auch interessieren. Hast du schon Erfahrung mit dem 
direkten Ansprechen der Treiber?

Mfg
Martin

von Robert B. (robert_b36)


Lesenswert?

Ok, also ich hör da raus, dass das so über VCP nicht zuverlässig 
funktionieren wird. Danke Uwe.

@Andi: Meinst du, mit dem nativen FTDI Treiber geht das, was ich 
vorhabe? Hast du damit schon mal in MATLAB gearbeitet? Ein paar Infos 
wären cool. Danke!

VG
Robert

von quik (Gast)


Lesenswert?

naja, ich hab mal gehört, das die VCP auf 300kbit/s beschränkt sind. 
Inwiefern das mit neuen **doof Versionen noch zutrifft, weiss ich jedoch 
nicht. Jedenfalls müsste dann mit der FTDI-Dll gearbeitet werden. Und 
soweit ich weiss, gabs da noch spezielle Dinge zu beachten, will man 
über die 980 kBaud hinaus, seitens der FTDI Konfiguration.

von quik (Gast)


Lesenswert?


von quik (Gast)


Lesenswert?


von j. c. (jesuschristus)


Lesenswert?

Man sollte dabei bedenken, dass Matlab nicht zwei Dinge gleichzeitig 
machen kann! Daten streamen und gleichzeitig verrechnen ist nicht. Immer 
nur Blockweise. Bei mir hat Matlab 64bit und FTDI immer gut 
funktioniert, nur 1 MBit habe ich nie gebraucht.

von Michael F. (startrekmichi)


Lesenswert?

Wir haben an der Uni eine Simulink-Simulation am laufen, die per FTDI 
mit der Hardware redet. Die Simulation selbst läuft mit 1kHz, die 
C-S-Function (die dann wirklich die Daten an den virtuellen COM-Port 
rausschiebt) aber nur mit 100Hz, mehr geht unter Windows wahrscheinlich 
auch gar nicht. Baudrate liegt bei 1M, an eigentlichen Daten geht aber 
gar nicht so viel drüber.

Harte Echtzeit ist das natürlich nicht, reicht aber für unsere Zwecke 
aus. Mit irgendwelchen Standard-Matlab-Blöcken brauchst du glaube ich 
gar nicht erst anzufangen, das ist alles viel zu langsam.

von Robert B. (robert_b36)


Lesenswert?

@quik: Danke für die Infos und die Links!

j. c. schrieb:
> Man sollte dabei bedenken, dass Matlab nicht zwei Dinge gleichzeitig
> machen kann! Daten streamen und gleichzeitig verrechnen ist nicht. Immer
> nur Blockweise. Bei mir hat Matlab 64bit und FTDI immer gut
> funktioniert, nur 1 MBit habe ich nie gebraucht.

@j. c.: Ja, das hätte ich auch nicht gewagt, sowas mit MATLAB zu 
versuchen, glaub ich. Die Signalverläufe sollen in MATLAB definiert 
werden. Wenn sie fertig sind, sollen sie nur noch gestreamt werden. Ich 
dachte eigentlich, dass 1 MBit/s nicht so schnell ist, dass es da schon 
Probleme gibt, ist aber scheinbar doch so.

Naja, alles in allem ist das auch nicht so hoch brisant, dass das jetzt 
funktionieren muss. Wäre ein nettes Addon, wenn man direkt streamen 
könnte. Eigentlich reicht es, wenn die Daten auf dem Gerät 
zwischengespeichert werden und dann abgespielt werden. Werde es bei 
Gelegenheit dann einfach mal ausprobieren.

@Michael: Danke auch dir für den Hinweis!

Viele Grüße
Robert

von Christian R. (supachris)


Lesenswert?

Wenn du genügend Hardware-Puffer hast, geht das. Aber ungepuffert wird 
das nix. Windows ist nun mal kein Echtzeit-OS, und MatLab ist noch viel 
viel weiter von Echtzeit entfern. Da braucht man echt Zeit, wenn man 
damit was machen will. Also großen Puffer auf der Hardware vorsehen und 
dann die Daten auf jeden Fall blockweise übertragen und zwar mit den 
vollen 3 MBit/s, damit du auch mal Lücken haben kannst. Gerade bei USB 
macht das OS nämlich dauernd irgendwelche Lücken, und das ist nicht auf 
Windows beschränkt. Auch unter Linux ist USB in dieser Hinsicht nicht 
besser.

von Max (Gast)


Lesenswert?

Ich verwede problemos im Simulink 1Mbit mit FTDI oder 1.228.800 bps mit 
PL-2303(!). Beim FTDI spreche ich, natürlich, direkt mit dll (hier nur 
eine Idee):
1
#include <windows.h>
2
#include <stdlib.h>
3
#include <stdio.h>
4
5
typedef unsigned long ULONG;
6
7
#include "FTD2XX.h"
8
9
char *pError;
10
static FT_HANDLE ftHandle;
11
12
void CSerCommOpen(void)
13
{
14
    FT_STATUS ftStatus;
15
    UCHAR LatencyTimer;
16
17
    if(ftHandle == 0)
18
    {
19
        ftStatus = FT_OpenEx("MYUSB_ID", FT_OPEN_BY_DESCRIPTION, &ftHandle);   // <- change USB-ID here!!!!!
20
        if (ftStatus == FT_OK)
21
        {
22
            ftStatus = FT_Purge(ftHandle, FT_PURGE_RX | FT_PURGE_TX);
23
            ftStatus = FT_SetBaudRate (ftHandle, 115200*4*2);  // maximum 921600 bs
24
            ftStatus = FT_SetDataCharacteristics (ftHandle, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
25
26
            ftStatus = FT_GetLatencyTimer(ftHandle, &LatencyTimer);
27
            if(ftStatus == FT_OK && LatencyTimer != 2)
28
                ftStatus = FT_SetLatencyTimer(ftHandle, 2);
29
            ftStatus = FT_SetTimeouts(ftHandle, 1000, 0);  // 1sec timeout
30
        }
31
        else
32
        {
33
            pError = "USB Open Error";
34
        }
35
    }
36
}
37
38
BOOL CSerCommClose(void)
39
{
40
    FT_Close(ftHandle);
41
    ftHandle = 0;
42
}
43
44
void SerCommWrite(char *p, int len)
45
{
46
     FT_STATUS ftStatus;
47
     DWORD m, n;
48
     char buf[80];
49
     int ret = 0;
50
51
  ftStatus = FT_Write (ftHandle, p, len, &n);
52
        if(ftStatus != FT_OK)
53
        {
54
            pError = "USB Error on Write";
55
        }
56
}
57
58
char *SerCommRead(char *p, int len)
59
{
60
    FT_STATUS ftStatus;
61
    DWORD m, n;
62
    static char buf[256];
63
64
    ftStatus = FT_Read(ftHandle, buf, len, &m);
65
    //      printf("Status:%d, returned:%d\n", ftStatus, m);
66
    if(ftStatus != FT_OK)
67
     {
68
                    pError = "USB Read Timeout";
69
     }
70
71
  return buf;
72
}

von TestX .. (xaos)


Lesenswert?

sry für die späte antwort
Martin K. schrieb:
>> die nativen ftdi treiber sind da pflicht
>
> Das Ganze würde mich auch interessieren. Hast du schon Erfahrung mit dem
> direkten Ansprechen der Treiber?
ja ich benutze die quasi nur noch, meistens aber mit dem JD2XX wrapper 
für java

Robert B. schrieb:
> @Andi: Meinst du, mit dem nativen FTDI Treiber geht das, was ich
> vorhabe? Hast du damit schon mal in MATLAB gearbeitet? Ein paar Infos
> wären cool. Danke!
ja das geht. habe das bisher über die JD2XX wrapper eingebunden und das 
ging bisher immer problemlos - das nervige ist nur der austausch der 
datenstrukturen zwischen java<>matlab.
die dll direkt einzubinden habe ich bisher noch nicht versucht, wird 
aber mal zeit. gibt ja einige dll loader mit denen man die libs direkt 
ansprechen kann

von Purzel H. (hacky)


Lesenswert?

Der Grund fuer Matlab ? Sie haben bei der Mathematik etwas weiter 
gedacht wie der Standard C Programmierer. Aber Mutitthreading & 
Kommunikation ? Kann man das vernuenftig ansteuern ? Allenfalls kann man 
den Mathematikteil in C oder so neu schreiben, und die bessere 
Infrastruktur bezueglich Kommunikation und Mutithreading verwenden. Es 
ist ja unwahrscheinlich, dass die Kommunikation das einzig Zeitkritische 
ist. Die Mathematik ist nicht zeitkritisch. Was haengt denn sonst noch 
dran ?

Falls das FTDI es nicht hinbekommt, gibt es auch einen Nachfolger, auch 
wieder von FTDI : Serial zu USB-2, da gehen 10MByte drueber.

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.