Kommandomodus BTM-112, BTM-222, BTM-182

Gast #2770130
Lesenswert?

Hallo,

ich verwende in einem Projekt ein BTM-182. Soweit funktioniert alles 
ganz gut. Einzig der Wechsel aus dem Datenmodus in den Kommandomodus 
funktioniert nicht.

Ich habe im Forum gesucht und verschiedene Threads gefunden. Alle 
angegebenen Lösungsvorschläge ausprobiert und keinen Erfolg damit 
gehabt.

Das Problem beschätigt mich jetzt seit ca. 2 Wochen. Auch Googeln hat 
leider keine neuen Erkenntnisse gebracht.

Hier was ich tue
1
/* ... Verbindung wurde aufgebaut, Daten empfangen nun wechseln in  
2
 * Kommandomodus um PIN zu ändern
3
 */
4

5
/* wait so modem can recognize escape sequence */
6
_delay_ms(1000);
7

8
/* set modem to command mode */
9
st_usart.st_sendBuffer.u8_base[0] = '+';
10
st_usart.st_sendBuffer.u8_base[1] = '+';
11
st_usart.st_sendBuffer.u8_base[2] = '+';
12
st_usart.st_sendBuffer.u8_base[3] = 0x0D;
13
st_usart.st_sendBuffer.u8_count = 4;
14
            
15
/* send data 
16
 * (Methode sendet "u8_count"-Zeichen per "Data Register Empty" Interrupt)
17
 */
18
prepareSendUSART();
19
            
20
/* Hier kann ich dann auf meinem Terminal die Zeichen "+++" mit Zeilenumbruch (0x0D) sehen */
21

22
/* wait some time */
23
_delay_ms(1000);
24

25
/* An dieser Stelle hätte ich eine Antwort des Modem erwartet, aber 
26
 * nie eine erhalten weder ERROR noch OK.
27
 */

(HINWEIS: ZUM BESSEREN VERSTÄNDNIS WAS GENAU GESENDET WIRD, WIRD JEDES 
BYTE IN '<' UND '>' EINGESCHLOSSEN. DIE KLAMMERN WERDEN NICHT 
MITGESENDET!)

Wenn ich jetzt den PIN mittels 
<'A'><'T'><'P'><'='><'1'><'2'><'3'><'4'><0x0D> ändern will, dann wird 
auch dieser Befehl über das Terminal übermittelt. Das Modem hat also 
nicht in den Kommandomodus gewechselt.

Es soll aber laut <'A'><'T'><'I'><'?'><0x0D> auf die Sequenz 
<'+'><'+'><'+'><0x0D> lauschen.

Kann mir jemand die genaue Sequenz mit Timings sagen?

Bitte verwendet für einzelne Bytes eine Umklammerung mit "<>". Beispiel: 
<'+'><'+'><'+'><0x0D>
Damit klar ist welche Zeichen tatsächlich gesendet werden müssen. Klar 
ist auch das die "<>" nicht gesendet werden dürfen!

Als Terminal verwende ich HTerm 0.8. Ich habe an die TX und RX Leitungen 
des Modems zustätzliche UART-Empfangsleitungen gelötet, so dass ich per 
MAX3232 in weiteren Terminals mitlesen kann was zwischen uC (AT90USB82) 
und Modem tatsächlich gesendet wird.
Gast #2770483
Lesenswert?

Moin,

habs mit folgender Sequenz probiert, hat auch nicht funktioniert
1
/* wait so modem can recognize escape sequence */
2
_delay_ms(500);
3

4
/* set modem to command mode */
5
            st_usart.st_sendBuffer.u8_base[0] = '+';
6
st_usart.st_sendBuffer.u8_count = 1;
7
            
8
/* send data */
9
prepareSendUSART();
10
        
11
/* wait some time */
12
_delay_ms(200);
13
            
14
st_usart.st_sendBuffer.u8_base[0] = '+';
15
st_usart.st_sendBuffer.u8_count = 1;
16
            
17
/* send data */
18
prepareSendUSART();
19
            
20
/* wait some time */
21
_delay_ms(200);
22
            
23
st_usart.st_sendBuffer.u8_base[0] = '+';
24
st_usart.st_sendBuffer.u8_count = 1;
25
            
26
/* send data */
27
prepareSendUSART();
28
            
29
/* wait some time */
30
_delay_ms(1000);
31
            
32
/* wait until modem is in command mode this does not work */
33
//while (st_usart.st_receiveBuffer.u8_base[0] != 'O') {};
34

35
/* modem now in command mode */
36

37
/* ... Hier sende ich dann ein Kommando ... */
38

39
/* get modem back to on-line mode */
40
st_usart.st_sendBuffer.u8_base[0] = 'A';
41
st_usart.st_sendBuffer.u8_base[1] = 'T';
42
st_usart.st_sendBuffer.u8_base[2] = 'O';
43
st_usart.st_sendBuffer.u8_base[3] = 0x0D;
44
st_usart.st_sendBuffer.u8_count = 4;
45

46
/* send data */
47
prepareSendUSART();
48

49
/* wait some time */
50
_delay_ms(100);

Das Modem bleibt im Daten Modus und reicht munter alle Eingabe an das 
angebundene Terminal weiter ...

Habe schon verschiedene Zeiten probiert, bis jetzt hat es mit keiner 
Wartezeit funktioniert.
Moderator Persönliche Seite #2770495
Lesenswert?

bkiepke schrieb:
> /* set modem to command mode */
> st_usart.st_sendBuffer.u8_base[0] = '+';
> st_usart.st_sendBuffer.u8_base[1] = '+';
> st_usart.st_sendBuffer.u8_base[2] = '+';
> st_usart.st_sendBuffer.u8_base[3] = 0x0D;
> st_usart.st_sendBuffer.u8_count = 4;

Nach den 3 Pluszeichen darf für eine Sekunde kein anderes Zeichen 
kommen, auch kein CR (0x0D). Also:

st_usart.st_sendBuffer.u8_base[0] = '+';
st_usart.st_sendBuffer.u8_base[1] = '+';
st_usart.st_sendBuffer.u8_base[2] = '+';
st_usart.st_sendBuffer.u8_count = 3;
// jetzt senden
// dann 1000ms warten

Gruß,

Frank

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