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
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 | }
|