Forum: Mikrocontroller und Digitale Elektronik Kommandomodus BTM-112, BTM-222, BTM-182


von bkiepke (Gast)


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.

von Stefan F. (sfrings)


Lesenswert?

Von Modems kenne ich das so, dass die +++ Sequenz für manuelle Eingabe 
gedacht ist. Vermutlich musst Du zwischen den + Zeichen einen Delay von 
200ms Einfügen.

500ms
+
200ms
+
200ms
+
1000ms
Befehl senden

von bkiepke (Gast)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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

von bkiepke (Gast)


Lesenswert?

korrektur funktioniert doch ...

von bkiepke (Gast)


Lesenswert?

... zumindest manchmal.

Sehr merkwürdig. Mit etwa 20 Versuchen hat es 2 mal geklappt. Da ist es 
wahrscheinlich einfacher die Verbinung von der anderen Seite zu kappen 
und dann auf dem Modem die Befehle auszuführen.

Wenn jemand noch Ideen hat, immer her damit.

Danke und Gruß
Benny

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.