BTM-222 wie sicher von online in Command Modus wechseln

OP #2444298
Lesenswert?

Hallo,

ich habe ein Projekt wo ich einen AVR Master abwechselnd mit anderen 
AVRs per Funk verbinde.
Als Funkmodul kommt das BTM222 zum Einsatz.
Im Prinzip funktioniert alles bestens, sobald ich zuverlässig im Command 
Modus lande.

Theoretisch muss man ja nur "+++" senden und man kommt in den Command 
Modus.
In der Zwischenzeit warte ich zwischen jedem "+" 30ms und es klappt so 
lala.
3 mal ja und dann nicht mehr....

Das kostet mich nun schon Tage.

Kann mir jemand Tipps geben wie ich das Modul sicher vom Online 
(Verbunden) Modus in den Command Modus bekomme um die Verbindung zu 
wechseln ?
Wie gesagt, bin ich im Command Modus ist alles kein Problem mehr.

Danke
Juergen
OP #2444348
Lesenswert?

Aktuell benutze ich folgenden Code und es scheint zu gehen zu 90%
Ich denke man versteht was gemacht wird
1
void connectBTM(uint8_t module)
2
{
3
  char mac[20];
4
  char pin[20];
5
  
6
  if (module==1)
7
  {
8
    sprintf(mac, "00126f21ee95");
9
    sprintf(pin, "1234");
10
  }
11
  else if (module==2)
12
  {
13
    sprintf(mac, "00126f224049");
14
    sprintf(pin, "1234");
15
  }
16
  
17
  uartClearRxBuffer();
18
  uint8_t de=35; // Delay *10ms
19

20
uint8_t z=0;
21
do
22
{
23
  uartClearRxBuffer();
24
  if (z>=3)
25
  {
26
    z=0;
27
    delayTimer(de*3);
28
    uartPuts("\r");  // Erzeugt ERROR wenn bereits im Command Modus
29
    delayTimer(de*3);
30
  }
31
  delayTimer(de);
32
  uartPut('+');
33
  while(uart.txpos > 0)  // warten bis alles gesendet
34
    nop();  
35
  z++;
36
}while(uart.rxpos < 4);  // Error oder OK +CR + LF
37
  
38
  uartClearRxBuffer();
39
  uartPuts("ATP=");
40
  uartPuts(pin);
41
  uartPuts("\r");
42
  while(uart.txpos > 0)
43
    nop();
44
  while(uart.rxpos < 3)
45
    nop();
46
  uartClearRxBuffer();
47

48
  delayTimer(30);
49
  
50
  uartPuts("ATD=");
51
  uartPuts(mac);
52
  uartPuts("\r");
53
  while(uart.txpos > 0)
54
    nop();
55
  while(uart.rxpos < 3)
56
    nop();
57
  uartClearRxBuffer();
58
  
59
  delayTimer(30);
60
  
61
  uartPuts("ATA\r");
62
  while(uart.txpos > 0)
63
    nop();
64
  while(uart.rxpos < 3)
65
    nop();
66
  uartClearRxBuffer();
67
}

Aber schön ist das nicht wirklich.
Das ist jetzt mal zum testen, bevor ich das ins eigentlich Programm 
einbaue.
Wenn noch jemand eine bessere Möglichkeit hat, nur zu.
OP #2444638
Lesenswert?

Ja die Pause davor und danach habe ich drinn.
Zeiten bis zu 3 Sekunden schon getestet.
Im Jetzigen Code versuche ich es einfach so lange bis es geht.
Pause, "+", kurze Pause, "+", kurze Pause, "+", Pause, CR

Das CR sorgt dafür, falls das Modul schon im Kommando Modus ist, bekommt 
man einen Error. Das "OK" Nach dem Wechsel in den Kommando Modus 
unterbleibt ja dann und kann dies nicht feststellen.

Die kurze Pause ist derzeit 350ms und die Lange 3*350ms.
Sind die Zeiten kürzer geht es nicht mehr Zuverlässig, sind diese länger 
auch nicht mehr.
Das merkt man auch wenn man es per Terminal versucht.
Da brauche ich auch einige Anläufe...

Aus der Modem Zeit weiss ich noch, das man direkt "+++" Pause schicken 
konnte und das ging immer......

Im Moment scheint es so zu gehen. Es dauert eben ein wenig und es gehen 
1-5 Versuche ins Land. Aber es scheint zu gehen.

Kennt keiner einen besseren Weg ?
Ich war schon am Überlegen den Reset zu benutzen. Das Modul kommt ja 
immer im Kommando Modus nach einen Reset. Dazu muss ich aber die 
Hardware ändern und würde ich gerne vermeiden.
Gast #2445041
Lesenswert?

V4.35 ist gut, da gibt es die Probleme mit dem Verschlucken von Zeichen 
im Command-Mode nicht mehr (war nur bis V4.22 so). Also bei mir klappt 
der Wechsel ohne Probleme, vielleicht solltest Du mal extern per Logic 
Analyzer, Scope oder notfalls weiterem PC schauen, was tatsächlich 
gesendet wird. Vielleicht wird da sporadisch etwas mitgesendet was die 
Sequenz stört.
OP #2445533
Lesenswert?

Logic Analyzer habe ich nicht.
Mit den Scope war nichts zu entdecken.
Mitgehört mit dem PC habe ich auch schon mit dem PC. Keine unerwarteten 
Zeichen.

Habe auch schon ein Minimalprogramm gemacht um das aus zu schließen.
Gleiches Ergebnis.

Ich habe sogar das Problem, das sich das Modul zwar Command mäßig 
umbuchen lässt, aber im Umbuchungs Vorgang hängt und auf nichts mehr 
reagiert.
Dann hilft nur noch ein Reset.

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