Forum: Mikrocontroller und Digitale Elektronik PIC -> WLAN Modul über UART. Verständnis des Programmcodes


von Gisti (Gast)


Lesenswert?

Wie schon einmal erwähnt versuche ich über die UART-Schnittstelle (über 
ein PIC24E) ein WIFI Modul (RN 131) zu konfigurieren. Microship stellt 
ein Beispielprogramm bereit, das ich soweit auf meine gegebene Hardware 
umgeschrieben habe (Konfiguration der I/Os und Initialisierung der 
UART-Schnittstelle).

Der PIC sendet (oder soll) die folgenden Kommandos an das Modul 
schicken, um es mit einem AP zu verknüpfen.

- $$$: -> Put the module into command mode.
- set wlan ssid <string> : -> Set the network’s SSID where <string> is 
the SSID.
- set wlan pass <string> : -> Set the passphrase to use when joining 
where <string> is the passphrase


...

Dies ist in dem Beispielprogramm mit der Funktion
1
err_t module_send_cmd(const char *response, const char *fmt, ...)
realisiert. Der Parameter response entspricht der zu erwartenden Antwort 
des RN-Moduls, während fmt dem Befehl entspricht. Ein Aufruf der 
Funktion könnte dann zum BEispiel so aussehen:
1
module_send_cmd("CMD", "$$$")
oder
1
module_send_cmd(CMD_AOK, "set w s %s", NETWORK_SSID)
1
module_send_cmd(NULL, "save")
1
module_send_cmd(CMD_AOK, "set w p %s", NETWORK_PASS)

Der gesamte Funktion befindet sich am Ende meines Beitrags.
Mir ist natürlich klar dass mir Niemand die komplette Funktion erklären 
kann, aber das grundsätzliche Verständis wäre mir wichtig.

Der erste Teil der Funktion scheint mir noch verständlich:
1
for(p = fmt; *p != '\0'; p++)
2
  {
3
    if(*p != '%')
4
    {
5
      //putU1(*p);
6
                    ConsolePut(*p);                       
7
                    continue;
8
    }
9
}
Solange Buchstabe im Befehl vorhanden ist, wird er über die Fkt. 
ConsolePut an U2TXREG ausgegeben. In der
1
switch(*++p) case
Anweisung wird dann der darauffolgende Buchstabe analysiert. 
Beispielsweise im case 'c' wird der nächste Wert in der Argumentliste an 
die Variable i übergeben und wiederum über Console(i) ausgegeben. Mir 
ist also 1. unverständlich, warum in der Case Anweisung gerade diese 
Buchstaben abgefragt werden und warum 2.die FUnktion itoa (integer into 
string) in anderen Fällen angewandt wird?
Im 2. Teil der Funktion wird die Antwort des RN-Moduls (also response) 
ausgewertet. Wenn mir jemand 3. die If-Abfrage
1
if(response != (const char *)NULL)
 erläutern könnte, wäre mir schon sehr geholfen. Ich vermute die 
Schleife wird solange durchlaufen wie der Pointer der auf den Parameter 
response zeigt nicht der "NULL-Response" entspricht?

Ich hoffe der Beitrag ist nicht zu unübersichtlich geworden. Vielen Dank 
im Voraus.


1
typedef int err_t
2
err_t RN_ERR_OK = 0
3
/**************************************************************************************************/
4
err_t module_send_cmd(const char *response, const char *fmt, ...)
5
{
6
  err_t retval = RN_ERR_OK;
7
  const char *p;
8
  va_list argp;
9
  int i;
10
  char *s;
11
  static char fmtbuf[256];
12
  static char rxbuff[256];
13
  int rxbuff_size = 0;
14
15
16
  if(response != (const char *)NULL)
17
  {
18
            memset(rxbuff, '\0', sizeof(rxbuff));
19
            serial_util_set_rn_rx_buffer(rxbuff, sizeof(rxbuff), &rxbuff_size);
20
  }
21
22
23
  va_start(argp, fmt);
24
  for(p = fmt; *p != '\0'; p++)
25
  {
26
    if(*p != '%')
27
    {
28
      //putU1(*p);
29
                    ConsolePut(*p);                       
30
                    continue;
31
    }
32
33
    switch(*++p)
34
    {
35
    case 'c':
36
      i = va_arg(argp, int);
37
                        ConsolePut(i);
38
      break;
39
40
    case 'd':
41
      i = va_arg(argp, int);
42
      s = itoa(fmtbuf, i, 10);
43
                        ConsolePutString(s);
44
      break;
45
46
    case 's':
47
      s = va_arg(argp, char *);
48
                        ConsolePutString(s);
49
      break;
50
51
    case 'x':
52
    case 'X':
53
      i = va_arg(argp, int);
54
      s = itoa(fmtbuf, i, 16);
55
                        ConsolePutString(s);
56
      break;
57
58
    case '%':
59
                        ConsolePut('%');
60
      break;
61
    }
62
                __delay_ms(1);
63
  }
64
65
        if(appendCRLF)
66
        {
67
            ConsolePut('\r');
68
            ConsolePut('\n');
69
        }
70
71
        /* This is where module will fill rn_rx_buffer with response via the ISR */
72
        __delay_ms(50);
73
        __delay_ms(50);
74
75
       LED_1 = 1;
76
77
  if(response != (const char *)NULL)
78
  {
79
                int r;
80
    retval = RN_ERR_READ;
81
                
82
    for(r = 0; r < MODULE_RX_CMD_RESPONSE_TIMEOUT; ++r)
83
    {
84
      if(rxbuff_size != 0 && strstr(rxbuff, response))
85
      {
86
                                LED_2 = 1;
87
        retval = RN_ERR_OK;
88
        break;
89
      }
90
91
      __delay_ms(10);
92
    }
93
94
    serial_util_remove_rn_rx_buffer();
95
  }
96
97
98
  return retval;
99
}
100
void ConsolePut(char c)
101
{
102
103
        U2TXREG = c;
104
}
105
void ConsolePutString(char* str)
106
{
107
    char c;
108
109
    while( c = *str++ )
110
        ConsolePut(c);
111
}
112
void serial_util_set_rn_rx_buffer(volatile char *buffer, size_t len, volatile int *size)
113
{
114
  rn_rx_buffer_idx    = size;
115
  rn_rx_buffer_len    = len;
116
  rn_rx_buffer        = buffer;
117
}

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.