Forum: Mikrocontroller und Digitale Elektronik USART 1MBaud Matlab will nicht so schnell :(


von dieter (Gast)


Lesenswert?

Hi,

ich habe hier einen ATMega16 mit 1MBaud bzw. 125000 Byte/s.
Mit meinem Terminalprogramm kann ich auch mit dieser Rate Daten 
übertragen. Am ATmega16 hängt ein paralleler DAC mit 8Bit. (Der auch 
schnell genug für die Rate ist.)

Jetzt habe ich in Matlab ein Skript erstellt, mit dem ich einzelne Bytes 
übertrage. Die Baudrate habe ich richtig eingestellt, aber die Bytes 
gehen nur im Bereich von 1ms über die Leitung. Ich sende jedes Zeichen 
einzeln. Ist das vielleicht der Fehler?
Macht es bei der seriellen Schnittstellen einen Unterschied, ob man in 
Windows jedes mal den Befehl für Byte senden aufruft. Oder muss man 
vielleicht sowas wie einen Buffer vollschreiben, der dann automatisch 
mit der Baudrate ausgegeben wird?

Der Matlabcode sieht so aus:
1
s = serial('COM6');
2
s.BaudRate = 1000000;
3
s.DataBits = 8;
4
s.StopBits = 1;
5
s.OutputBufferSize = 50000; %definiert, aber wie schreibt man direkt rein?
6
fopen(s);
7
8
K=zeros(255,1);
9
a=1;
10
11
%K(i) ist Vektor mit den Byte Werten
12
13
for i=1:1:10000000 %10 Sekunden
14
    fwrite(s,K(i));
15
end
16
17
fclose(s)
18
delete(s)
19
clear s

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

dieter schrieb:
> Ich sende jedes Zeichen einzeln. Ist das vielleicht der Fehler?

Ziemlich sicher; jeder "fwrite"-Aufruf hat einen Devicetreiberaufruf zur 
Folge, und das bedeutet eine Taskumschaltung zwischen Matlab-Prozess und 
Windows-Kernel. Diese Umschaltung erfolgt (bestenfalls) mit einer 
Granularität von 1 msec, deswegen sollten pro Devicetreiberaufruf 
mehrere Bytes (genauer: so viel wie möglich) übertragen werden.

"fwrite" sollte auch mehr als ein einzelnes Byte schreiben können; was 
steht denn in der matlab-Dokumentation dazu?

von Michael F. (startrekmichi)


Lesenswert?

Ich hatte da vor einiger Zeit mal etwas rumgesucht und es ist glaube ich 
heraus gekommen, dass Matlab selber ziemlich lahm ist in Bezug auf 
rs232. Mal ganz abgesehen davon, dass einzelne Bytes zu schreiben nicht 
sehr sinnvoll ist.

Ich habe für unsere Simulink-Flugsimulation an der Uni (für ein 
hardware-in-the-loop Testbed) eine S-Function in C geschrieben, die 
funktioniert bei 1kHz und 100 Byte/Zyklus bei 1MBaud ganz gut.

von Sys (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Diese Umschaltung erfolgt (bestenfalls) mit einer
> Granularität von 1 msec, deswegen sollten pro Devicetreiberaufruf
> mehrere Bytes (genauer: so viel wie möglich) übertragen werden.

Sind System Call unter Windows wirklich so langsam ?
Hier mal zum Vergleich System Calls auf meiner 3GHZ AMD Linux Kiste:

$ dd if=/dev/zero of=/dev/null bs=1 count=100000000
100000000+0 records in
100000000+0 records out
100000000 bytes (100 MB) copied, 23.0181 s, 4.3 MB/s
$

8,6E6/sec liegen einige Zehnerpotenzen drüber.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sys schrieb:
> Hier mal zum Vergleich System Calls auf meiner 3GHZ AMD Linux Kiste:

Da vergleichst Du wohl Birnen mit Pinguinen. Entscheidend ist, was 
Matlab anstellt, wenn es einzelne Bytes auf die serielle Schnittstelle 
ausgibt. Und die Definition dessen, was ein "System Call" ist, dürfte 
hier auch divergieren.

von Hauspapa (Gast)


Lesenswert?

Mir sind bisher nur RS232 via USB Kabel bekannt die diese 
Geschwindigkeiten packen. USB macht Mindestpacket längen (512Byte 
Nutzdaten wenn ich mich nicht Irre). Bremst bei Byte verschickt auch 
ganz nett.

viel Erfolg
Hauspapa

von dieter (Gast)


Lesenswert?

Habe das Problem gelöst.

Ich kann mit fwrite(serial_stream, vektor) auch nen Vektor verschicken 
also direkt mehrere Bytes. Die werden anscheinend alle in meinen 
Outputbuffer geschrieben und der wird wirklich mit der Baudrate 
ausgegeben. Nur in den Buffer kann man einzelne Bytes nicht mit der 
Baudrate schreiben, aber ganze Pakete schon.

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.