Problem mit Arduino Serial Kommunikation

Butcher

Bill the Butcher
#1
Hallo Hallo,

Momentan bin ich am fertig stellen meines HOTT trackers in eigenbau, alles funktioniert soweit prima, ABER ich hab ein grundlegendes Problem beim Abfragen der daten via Serieller schnittstelle am arduino, dazu ein kleines beispiel womit ich mich grad versuche dem Problem zu nähern:

UPDATE:
Nachdem ich nun auf nen 5v arduino umgestiegen bin funktioniert auch die Kommunikation zwischen PC und Arduino prima bei 115200Baud.(danke Frickler)

nun kommen wir zum nächsten problem:

Via SoftwareSerial möchte ich gerne einige HEX zeichen übertragen, also folgendes scenario:
ich sende via SoftwareSerial (hier hängt das BT modul) vom arduino an die Funke:
0x00 0x03 0xfc 0x00 0x00 0x04 0x38 0x9f 0x7b

Das scheint schon nicht richtig zu klappen, wie bringe ich SoftwareSerial dazu eben diesen HexCode zu senden?

Antworten tut mir die Funke dann ebenfalls mit HEX code, wie stelle ich dann die Speicherung an?
meine Idee war ein byte incomming[50] array, und dann:
int i = 0;
while(bt.available() > 0){
gpsBytes = bt.read();
i++;
}

das scheint auch nicht zu klappen, mache ich da irgendwo nen fehler?

Wenn ich das BT modul an den Arduino anschließe sollten einige statusmeldungen kommen:
BTSTATE:1\r\nBTSTATE:2,......
Wenn ich dies über oben genannte schleife einlese und dann an den PC via normalem Serial sende, kommt mist bei rum, woran liegt das ?

Danke euch :)
 
Zuletzt bearbeitet:

OlliW

Erfahrener Benutzer
#2
Hey Butcher

also, ich benutze Arduino Code nicht, aber ich könnte mir vorstellen dass das Problem an den 3.3V liegt, diese Arduinos laufen mit 8 MHz, aber der "originale" Arduino-Code ist für 16MHz ausgelegt, könnte sich lohnen mal nachzusehen ob die 8MHz bei den 3.3V richtig berücksichtigt wird (Alternativ versuche mal ob es mit 57600 beim HTerm funktioniert). Zudem ist es so dass die serial Library relativ viel Speicherplatz belegt, wenn du also selber viel Speicher benutzt kannst du schnell ein Problem haben. Viel Speicher könntest du z.B. dadurch verbrauchen dass du Text für die Ausgabe definiert hast, das unbedingt mit PROGMEM machen.

Cheers, Olli
 

Butcher

Bill the Butcher
#4
@der frickler, selbst ohne das delay funktioniert es nicht, hatte ich schon probiert

@ olliw, das problem was du ansprichst hatte ich auch schon, da hatte ich allerdings im arduino tool das falsche board gewählt, werde es aber gleich mal testen, glaube ich aber nicht dran, aber testen werd ichs,... später sollen ja die GPS daten an dieser stelle ankommen, daher muss das funktionieren :()
 
#5
Klar, wenn du das falsche Board auswählst dann wird der code mit falscher CPU-FREQ kompiliert und läuft dann schneller/langsamer. Damit ist die serielle Kommunikation dann im Arsch.

Aber dein Problem ist ein anderes denke ich, der 8Mhz kann keine 115200 Baud da es keinen passenden Teiler gibt bei der Frequenz:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=45268&start=0

Kurz zusammengefasst:
Yep, there is a solution. Don't use 8 MHz or don't use 115200 bps.
 

Rangarid

Erfahrener Benutzer
#8
Ja damit hatte ich auch mal Probleme, man kann aber bei 8Mhz Arduino auch das 16Mhz Board einstellen, dann sollte es gehen.

Abgesehen davon is der Code eh komisch, ich würde das so machen:

Code:
void loop(){
       if (Serial.available()) {
             serial.write(Serial.read());
       }
}
Den loop macht er ja so oder so immer wieder, du brauchst also die erste while Schleife nicht.
 
Zuletzt bearbeitet:

OlliW

Erfahrener Benutzer
#9
Aber dein Problem ist ein anderes denke ich, der 8Mhz kann keine 115200 Baud da es keinen passenden Teiler gibt bei der Frequenz:
doch geht, ausreichend gut
man muss aber dass U2Xn bit setzen, und eben ein anderes Teilerverhältnis nehmen, ich glaube nicht dass das der Arduino Code macht... die Genauigkeit ist dann -3.5% und damit nach "Lehrbuch" zu groß, aber ich hatte bisher keine Probleme mit
wenn man es wirklich genau haben will dann gehen nur 38400
wenn man das alles nicht berücksichtigt, lüft die UART effective auf 57600, daher im HTerm mal einfach 57600 ausprobieren


Datenblatt tabelle 19-11
 
#10
@OlliW: Ah Ok, gut zu wissen, denke der Arduino kanns aber halt nicht sauber.

Ja damit hatte ich auch mal Probleme, man kann aber bei 8Mhz Arduino auch das 16Mhz Board einstellen, dann sollte es gehen.
Nein, definitiv nicht, dann geht garnix mehr, da alles genau halb so schnell läuft wie es soll.
Kannst z.B. am Blink Beispiel sehr schön sehen.
 

Rangarid

Erfahrener Benutzer
#12
Nein, definitiv nicht, dann geht garnix mehr, da alles genau halb so schnell läuft wie es soll.
Kannst z.B. am Blink Beispiel sehr schön sehen.
Also bei dem HK ArduIMU das auch mit 3.3V und 8Mhz läuft MUSS ich 5V 16Mhz auswählen, weil sonst nichts mehr geht. Wenn ich 3.3V hole stimmt die Serielle Übertragung nichtmehr und die Sensoren werden auch nicht ausgelesen.

Wenn ich dann wie weiter vorne beschrieben am Seriellen Monitor die Baudrate verdoppele oder halbiere (weiß grad nich wie rum) stimmt dann zwar die Ausgabe, aber die Sensoren und so gehen trotzdem nicht.

Soweit ich weiß ist dieses Problem aber auch erst mit Arduino 1+. Vorher gab es einen Fehler wenn man am 5V Arduino den 3.3V Arduino ausgewählt hat oder umgekehrt. Bei dem ArduIMU könnte es natürlich auch einfach dran liegen, dass auf dem 3.3V Arduino der 5V Bootloader läuft...das könnte ich mir auchnoch vorstellen bei HK und diversen anderen billig Arduinos aus China.
 
Zuletzt bearbeitet:

Butcher

Bill the Butcher
#13
hey danke, da muss ich dann wohl leider den mit 16 mhz nehmen da ich für mein projekt dringend die 115200 brauche, da ich auf der gegenseite wleider nichts einstellen kann:( da mein BT modul im pürinzip nur nen kabel ersetzen soll, und die gegenseite eben ne feste baudrate hat :(

danke euch, ich grab mir jetz nen 5v arduino aus und teste es :)
 

Butcher

Bill the Butcher
#14
it works, erstmal zu testzwecken kleinere baudrate genommen, wie beschrieben wurde, auf 9600 funzt es ohne weiteres, nun kann ich experimentieren um die BT kommunikation endlich fertig zu bekommen Danke :)
 
FPV1

Banggood

Oben Unten