Forum: Mikrocontroller und Digitale Elektronik Bluetooth Modul HC06 Baudrate zu hoch eingestellt


von Andreas (Gast)


Lesenswert?

Habe mein Bluetooth Modul HC06 kurz nach dem Kauf auf eine Baudrate von
230400 gesetzt.

Einfach BT-Modul(Werks-Baudrate 9600) an Arduino (eingstellte Baudrate 
9600) und über den Serial Monitor AT+BAUD9 (=230400) gesetzt.
Hat auch funktioniert wie es soll und die Baudrate beträgt nun 230400.

Leider unterstützt der Serial Monitor von Arduino so eine hohe Baudrate 
nicht und ich kann sie (auf diesem Weg) nicht mehr zurück auf z.B 9600 
setzen.

Was wäre die beste Möglichkeit dieses Problem zu umgehen?

Folgendes habe ich probiert:

1.
- Externes Hyperterminal PuTTy
- Arduino mit USB an PC und in PuTTy 230400 Baud, COM PORT von Arduino 
eingestellt
- BT-Modul an TxD,RxD von Arduino
- Wenn ich jetzt AT+BAUD4 (9600), oder AT+VERSION usw. eingebe kommt 
nichts zurück

2.
- BT-Modul - MAX232 - PC (WinXP Hyperterminal)
- Im Terminal die Befehle gesendet, aber kommt leider nichts zurück

3.
- Leider nicht vorhanden aber müsste möglich sein ?!
- Bluetooth Modul für PC kaufen und die beiden Module mit Pairing Code 
verbinden,
danach am PC die Baudrate des HC06 Moduls ändern?!
- Wäre das auch übers Smartphone möglich?

von blue man (Gast)


Lesenswert?

das problem habe ich mit meinem btm-222 modul und einem atmega32 auch.
ich dachte, ich wäre der einzige, der sich so einen doofen fehler 
leisten würde. und ja, ich weiß, RTFM passt bei mir in diesem fall wie 
die faust aufs auge.
jedenfalls kam ich zu keiner lösung, mein usart am atmega32 @ 16 mhz hat 
laut datasheet einen 3%igen fehler und damit kann ich nicht mehr 
rekonfigurieren :(
wäre ebenfalls an einer lösung interessiert, sonst wars halt lehrgeld 
und ich kauf mir nen neues. 10€ tun jetzt auch nicht so weh. aber wäre 
schon schade um die hardware.

von Max D. (max_d)


Lesenswert?

Also ein FT232RL kann bis auf 2MBaud oder so hoch.
Mit einem passenden Terminal sollten also auch 230k rekonfigurierbar 
sein.

von Andreas (Gast)


Lesenswert?

Beim WinXP Terminal kann man eine Baudrate von 230400 verwenden.

Also BT-Modul --> MAX232 --> PC Terminal

und übers Terminal sende ich dem Modul das Kommando die Baudrate zu 
wechseln ?!

von Andreas (Gast)


Lesenswert?

FT232 mein ich =)

von Andreas (Gast)


Lesenswert?

Könnten Blue Man und ich nicht einfach einen 7,3728 MHz Quarz beim AVR 
verwenden?
Wäre ein vielfaches der Baudrate und müsste somit gehen.

von Mike (Gast)


Lesenswert?

Andreas schrieb:
> - Wenn ich jetzt AT+BAUD4 (9600), oder AT+VERSION usw. eingebe kommt
> nichts zurück

> - Im Terminal die Befehle gesendet, aber kommt leider nichts zurück

Den termination character hast du richtig eingestellt?
https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-V.250-200307-I!!PDF-E&type=items

HTerm ist für solche Fälle sehr zu empfehlen. Da kannst du alles 
einstellen und in diversen Formaten ansehen/eingeben.

von blue man (Gast)


Lesenswert?

Andreas schrieb:
> Könnten Blue Man und ich nicht einfach einen 7,3728 MHz Quarz beim AVR
> verwenden?
> Wäre ein vielfaches der Baudrate und müsste somit gehen.

Danke, aber ich habe darauf hin meinen externen Takt schon auf 16Mhz 
umgelötet, aber da bleibt immer noch ein Fehler von 3% und das ist noch 
zuviel bei mehreren Konfigurationsbytes.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Andreas schrieb:
> Beim WinXP Terminal kann man eine Baudrate von 230400 verwenden.
>
> Also BT-Modul --> MAX232 --> PC Terminal

Die Onboard-Schnittstellen eines PCs können maximal 115200.

Um höhere Baudraten zu erzielen, ist zwingend andere 
Schnittstellenhardware erforderlich, entweder eine USB-Seriell-Bridge 
oder eine PCI/PCIe-Schnittstellenkarte mit geeigneter UART darauf.

Was irgendwelche Terminalprogramme als Baudrate in Auswahllisten 
anbieten, hat nichts damit zu tun, was die tatsächliche Hardware oder 
der genutzte Treiber zulassen; beim nicht-Terminalprogramm "hTerm" kann 
im Eingabefeld für die Baudrate ein beliebiger Wert eingegeben werden, 
der vom Devicetreiber und der Hardware als am nächstbesten passende 
möglichen Baudrate interpretiert wird.

von Martin S. (maklin)


Lesenswert?

Auch auf die Gefahr hin, dass ich einen Preis für den schäbigsten Code 
bekomme, möchte ich hier in diesem (älteren) Thread meinen Code posten, 
der es mir zusammen mit einem Atmega328 (20 MhZ) gerade ermöglicht hat, 
wieder auf den HC06 zugreifen zu können, indem der UART "einfach" 
manuell programmiert wurde. Zunächst hatte ich vor, die ganze Sache in 
Assembler zu implementieren, aber der Compiler hat aus dem C-Code einen 
ausreichend genauen Code (für 20 MhZ(!)) basteln können.
1
void uart_reparatur(void)
2
{
3
  DDRD |= (1<<PD1); //TXD=Ausgang
4
  
5
  //Startbit
6
  PORTD &=~ (1<<PD1); //0
7
  _delay_us(1);
8
  //A 65  0100 0001
9
  PORTD |= (1<<PD1); //1
10
  _delay_us(1);
11
  PORTD &=~ (1<<PD1); //0
12
  _delay_us(1);
13
  PORTD &=~ (1<<PD1); //0
14
  _delay_us(1);
15
  PORTD &=~ (1<<PD1); //0
16
  _delay_us(1);
17
  PORTD &=~ (1<<PD1); //0
18
  _delay_us(1);
19
  PORTD &=~ (1<<PD1); //0
20
  _delay_us(1);
21
  PORTD |= (1<<PD1); //1
22
  _delay_us(1);
23
  PORTD &=~ (1<<PD1); //0
24
  _delay_us(1);
25
  //Stopbit
26
  PORTD |= (1<<PD1); //1
27
  _delay_us(1);
28
  
29
  _delay_us(5);
30
31
32
  //Startbit
33
  PORTD &=~ (1<<PD1); //0
34
  _delay_us(1);
35
  //T 84  0101 0100
36
  PORTD &=~ (1<<PD1); //0
37
  _delay_us(1);
38
  PORTD &=~ (1<<PD1); //0
39
  _delay_us(1);
40
  PORTD |= (1<<PD1); //1
41
  _delay_us(1);
42
  PORTD &=~ (1<<PD1); //0
43
  _delay_us(1);
44
  PORTD |= (1<<PD1); //1
45
  _delay_us(1);
46
  PORTD &=~ (1<<PD1); //0
47
  _delay_us(1);
48
  PORTD |= (1<<PD1); //1
49
  _delay_us(1);
50
  PORTD &=~ (1<<PD1); //0
51
  _delay_us(1);
52
  //Stopbit
53
  PORTD |= (1<<PD1); //1
54
  _delay_us(1);
55
  
56
  _delay_us(5);
57
  
58
  //Startbit
59
  PORTD &=~ (1<<PD1); //0
60
  _delay_us(1);
61
  //+ 43  0010 1011
62
  PORTD |= (1<<PD1); //1
63
  _delay_us(1);
64
  PORTD |= (1<<PD1); //1
65
  _delay_us(1);
66
  PORTD &=~ (1<<PD1); //0
67
  _delay_us(1);
68
  PORTD |= (1<<PD1); //1
69
  _delay_us(1);
70
  PORTD &=~ (1<<PD1); //0
71
  _delay_us(1);
72
  PORTD |= (1<<PD1); //1
73
  _delay_us(1);
74
  PORTD &=~ (1<<PD1); //0
75
  _delay_us(1);
76
  PORTD &=~ (1<<PD1); //0
77
  _delay_us(1);
78
  //Stopbit
79
  PORTD |= (1<<PD1); //1
80
  _delay_us(1);
81
  
82
  _delay_us(5);
83
  
84
  
85
  //Startbit
86
  PORTD &=~ (1<<PD1); //0
87
  _delay_us(1);
88
  //B 66  0100 0010
89
  PORTD &=~ (1<<PD1); //0
90
  _delay_us(1);
91
  PORTD |= (1<<PD1); //1
92
  _delay_us(1);
93
  PORTD &=~ (1<<PD1); //0
94
  _delay_us(1);
95
  PORTD &=~ (1<<PD1); //0
96
  _delay_us(1);
97
  PORTD &=~ (1<<PD1); //0
98
  _delay_us(1);
99
  PORTD &=~ (1<<PD1); //0
100
  _delay_us(1);
101
  PORTD |= (1<<PD1); //1
102
  _delay_us(1);
103
  PORTD &=~ (1<<PD1); //0
104
  _delay_us(1);
105
  //Stopbit
106
  PORTD |= (1<<PD1); //1
107
  _delay_us(1);
108
  
109
  
110
  _delay_us(5);
111
  
112
  //Startbit
113
  PORTD &=~ (1<<PD1); //0
114
  _delay_us(1);
115
  //A 65  0100 0001
116
  PORTD |= (1<<PD1); //1
117
  _delay_us(1);
118
  PORTD &=~ (1<<PD1); //0
119
  _delay_us(1);
120
  PORTD &=~ (1<<PD1); //0
121
  _delay_us(1);
122
  PORTD &=~ (1<<PD1); //0
123
  _delay_us(1);
124
  PORTD &=~ (1<<PD1); //0
125
  _delay_us(1);
126
  PORTD &=~ (1<<PD1); //0
127
  _delay_us(1);
128
  PORTD |= (1<<PD1); //1
129
  _delay_us(1);
130
  PORTD &=~ (1<<PD1); //0
131
  _delay_us(1);
132
  //Stopbit
133
  PORTD |= (1<<PD1); //1
134
  _delay_us(1);
135
  
136
  
137
  _delay_us(5);
138
    
139
  //Startbit
140
  PORTD &=~ (1<<PD1); //0
141
  _delay_us(1);
142
  //U 85  0101 0101
143
  PORTD |= (1<<PD1); //1
144
  _delay_us(1);
145
  PORTD &=~ (1<<PD1); //0
146
  _delay_us(1);
147
  PORTD |= (1<<PD1); //1
148
  _delay_us(1);
149
  PORTD &=~ (1<<PD1); //0
150
  _delay_us(1);
151
  PORTD |= (1<<PD1); //1
152
  _delay_us(1);
153
  PORTD &=~ (1<<PD1); //0
154
  _delay_us(1);
155
  PORTD |= (1<<PD1); //1
156
  _delay_us(1);
157
  PORTD &=~ (1<<PD1); //0
158
  _delay_us(1);
159
  //Stopbit
160
  PORTD |= (1<<PD1); //1
161
  _delay_us(1);
162
  
163
  
164
  _delay_us(5);
165
  
166
  //Startbit
167
  PORTD &=~ (1<<PD1); //0
168
  _delay_us(1);  
169
  //D 68  0100 0100
170
  PORTD &=~ (1<<PD1); //0
171
  _delay_us(1);
172
  PORTD &=~ (1<<PD1); //0
173
  _delay_us(1);
174
  PORTD |= (1<<PD1); //1
175
  _delay_us(1);
176
  PORTD &=~ (1<<PD1); //0
177
  _delay_us(1);
178
  PORTD &=~ (1<<PD1); //0
179
  _delay_us(1);
180
  PORTD &=~ (1<<PD1); //0
181
  _delay_us(1);
182
  PORTD |= (1<<PD1); //1
183
  _delay_us(1);
184
  PORTD &=~ (1<<PD1); //0
185
  _delay_us(1);
186
  //Stopbit
187
  PORTD |= (1<<PD1); //1
188
  _delay_us(1);
189
  
190
  
191
  _delay_us(5);
192
  
193
  
194
  //Startbit
195
  PORTD &=~ (1<<PD1); //0
196
  _delay_us(1);  
197
  //8 56  0011 1000
198
  PORTD &=~ (1<<PD1); //0
199
  _delay_us(1);
200
  PORTD &=~ (1<<PD1); //0
201
  _delay_us(1);
202
  PORTD &=~ (1<<PD1); //0
203
  _delay_us(1);
204
  PORTD |= (1<<PD1); //1
205
  _delay_us(1);
206
  PORTD |= (1<<PD1); //1
207
  _delay_us(1);
208
  PORTD |= (1<<PD1); //1
209
  _delay_us(1);
210
  PORTD &=~ (1<<PD1); //0
211
  _delay_us(1);
212
  PORTD &=~ (1<<PD1); //0
213
  _delay_us(1);
214
  //Stopbit
215
  PORTD |= (1<<PD1); //1
216
  _delay_us(1);
217
  
218
219
}

von Martin S. (maklin)


Lesenswert?

Kleiner Nachtrag: Der Code oben war zum Zurückstellen von 921600 (*) auf 
115200 und müsste bei anderen Werten natürlich angepasst werden.

(*) Was mit einem gewissen Fehler bei 1 us Bitzeit so halbwegs passt...

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.