Bluetooth-UART sehr langsam! Warum?

Gast #2663421
Lesenswert?

Hallo!
Ich möchte daten von MAX/MSP über die serielle Schnittstelle auf ein 
Mikrocontroller (Teensyboard bzw ATMEGA32U4) übertragen. Dort werden die 
Daten in I2C umgewandelt und an einen LED-Dimmer geschickt. Das sind 48 
Bytes (weil 48 Lampen) und das ca 30 mal pro sek. Eigentlich sollte 
Bluetooth das schaffen?

Wenn ich die USB Schnittstelle des uC nehme funktioniert es tadellos, 
sämtliche LEDs werden ohne erkennbare Latenz gedimmt wie es sein soll.

Nun möchte ich aber eine Bluetooth-UART Brücke verwenden weil ich keine 
lust habe auf 7m USB-Kabel
Also habe ich erst die uC Software auf UART umgeschrieben und mit einem 
USB-UART wandler getestet. Auch das klappt wunderbar.

Wenn ich allerdings ein Bluetooth "Luftkabel" nehme empfängt der uC nur 
die hälfte der Daten und die LEDs dimmen meist nur in drei oder vier 
Stufen, je nach dem wie dynamisch die LEDs angesteuert werden.

Ich habe ein billig-bluetooth Dingen von DealExtreme genommen und auch 
ein BTM-220 ausprobiert.
Bei beiden das gleiche Problem, die Baudrate habe ich mal auf höchste 
Stufe gestellt.. aber das ändert nichts.
Da ich einen MAC verwende habe ich es mal auf meiner Windows Partition 
ausprobiert: Dort wird nicht mal das Bluetooth Ding erkannt...

Soll ich noch mal eine ganz andere Hardware ausprobieren, bei Sparkfun 
z.b gibt es teure  Bluetooth "Shields" (immer diese kack Shields!)  aber 
ob das was bringt?

Lg

Bernd
Gast #2663451
Lesenswert?

In der MAX/MSP reference zu dem Serial-Object welches die Daten 
rausschickt steht:

"It transmits data by taking a byte (an integer in the range of 0-255) 
in its inlet and sending it over the selected serial port."

Also müsste ich dafür sorgen dass das als Packet geschickt wird?

Dann gibt es noch folgende option:

"chunk" => Sets the data chunk size (data list length) for output.

Die habe ich auf 50 gestellt. Ändert auch nichts (war aber auch nur 
geraten dass das was damit zu tun haben könnte)

Gruss

Bernd
Gast #2663864
Lesenswert?

> Wie kann ich denn ganze Blöcke schicken?

fopen/fwrite in c. Und wenns nur zum Testen ist - max kann das 
möglicherweise nicht richtig(tm). Falls sich das Problem damit beheben 
(oder zumindest verringern) lässt, dann könntest Du ein 'Plugin' 
(oderwieimmerdasheisstinmax) bauen, das die Serielle richtig(tm) 
bedient.

Möglicherweise gibts auch irgendwo(tm) eine Treibereinstellung..

> Und wieso funktioniert es dann mittels Kabel trotzdem?

Weil Kabel keinen (unerwarteten) Overhead produziert, UART-über-Blauzahn 
aber schon (bei falscher Nutzung sogar ganz massiv).

HTH
Gast #2663925
Lesenswert?

Bluetooth mach einen Verbindungsaufbau. Und wenn es diesen fuer jedes 
Byte einzeln machen muss ist die Bandbreite weg. Ich empfehl das Ganze 
als Stream zu senden, alle 30ms die 48 bytes, aber ohne die Verbindung 
abzubauen.
Gast #2664551
Lesenswert?

Wo muss ich denn prinzipiell anfangen um daten als Stream zu senden?
In der Software mit der ich die Daten versende? Oder in den 
Einstellungen bei MAC? Oder beim Bluetooth Device selber?

Stehe da etwas auf dem Schlauch :-(
Gast #2664619
Lesenswert?

> machst du 30 mal fwrite(1 byte) oder einmal fwrite(30 bytes)?

Er macht wohl keines davon, max vermutlich grob ersteres. Zum Testen 
sollte der TO mal zweiteres probieren, hat er aber bisher 
augenscheinlich noch nicht. Erst wenn das klappt kann man darüber 
nachdenken, dem Rest zu optimieren.
Gast #2664685
Lesenswert?

Hallo! Danke schonmal für die Infos.
Wie genau MAX die Daten sendet lässt sich so einfach nicht rauskriegen.
Scheinbar Byte für Byte.
Womit kann ich was anderes ausprobieren?
Müsste ich was mit Java programmieren um mehr optionen zur 
Schnittstellennutzung zu haben?

Mit Processing habe ich es auch probiert.. kommt aufs gleiche hinaus.

Gruss

Bernd

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren