通过 c 代码发送 ctrl+z 并使用 HTTPDATA AT 命令使用 GSM 模块将数据发送到服务器的问题

问题描述

操作系统:Ubuntu(20.04) MCU:ESP WROOM 32 GSM/LTE:Cavli C10AM 操作:AT+HTTPDATA

我使用 ESP32 与 Cavli C10AM 模块连接。我正在成功初始化它并且能够发送基本的 AT 命令并接收正确的响应。我能够启动 HTTP 通信并能够使用 HTTPGET AT 命令从服务器获取响应。

现在,我正在尝试将数据发布到 URL。使用 AT+HTTPPara AT 命令设置 URL、内容类型后,我发送 AT+HTTPDATA 将数据发布到服务器。对此,我正确地得到了“>”符号。在解析此响应时,我使用字符串发送数据 (json)(即,我将 json 存储在字符串中并尝试发布它)。该过程要求我在最后发送 ctrl+z。我在通过 UART 发送“26”发送数据后执行此操作。我也尝试过'/032',但我没有得到'OK'响应。我收到了 +cme ERROR 3 响应。

错误信息是:

I (46271) RX_TASK: Wrote 42 bytes
Command number is : 11
Written bytes are: AT+HTTPPara="CONTENT","application/json"
 
I (48771) RX_TASK: Read 6 bytes: '
OK
'
Read bytes are 
OK
: 
I (49771) RX_TASK: Wrote 13 bytes
Command number is : 12
Written bytes are: AT+HTTPDATA
 
I (52271) RX_TASK: Read 4 bytes: '
> '
Read bytes are 
> : 
Inside HTTPDATA function 
 '>' is in 2th byte and value is >: 
Sent bytes in HTTPDATA ctrl+z are 2 and buffer is 26  
received bytes are 0 

我解析“>”符号的方式是:

                #define CTRL_Z 26     // for sending ctrl+z
                char buffer[10];


                //I enter the HTTPDATA function here
                if(i==12){
                printf("Inside HTTPDATA function \n");
                char data[] = "{\"name\": \"S-1234\",\"mac\": \"123456789abc\"}";

               // Parsing the response from AT+HTTPDATA,on occurance of '>',send data via UART
                for(int k=0; k<27; k++ ){
                    if(response[k] == '>'){
                        sprintf (buffer,"%d",CTRL_Z); //storing ctrl+z in 'buffer'
                        int sent_bytes=0;
                        printf(" '>' is in %dth byte and value is %c: \n",k,response[k]);
                        sent_bytes = uart_write_bytes(UART_NUM_1,data,strlen(data));
                        vTaskDelay(100 / portTICK_PERIOD_MS);
                        sent_bytes = uart_write_bytes(UART_NUM_1,buffer,strlen(buffer));
         printf("Sent bytes in HTTPDATA ctrl+z are %d and buffer is %s\n",sent_bytes,buffer);
                        vTaskDelay(1000 / portTICK_PERIOD_MS);
                        const int rcvd_cert =  uart_read_bytes(UART_NUM_1,data_2,RX_BUF_SIZE,1000 / portTICK_RATE_MS);
                        ESP_LOGI("CERT_WRITTEN_TASK","Read %d bytes: '%s'",rcvd_cert,data_2);
                        printf("received bytes are %d \n",rcvd_cert);

但是,在通过 UART 发送后,如果我如上所述使用 uart_read_bytes 读取,而不是读取“OK”,我将不会收到任何响应。 (回复粘贴在代码上方)。

是我解析 '>' 的方式是错误的还是我发送 ctrl+z 的方式是错误的,我不知道。如果有人有这个解决方案,请帮我解决这个问题。提前感谢您提供任何线索。

解决方法

这一行是错误的,因为您将 Ctrl-Z 转换为其十进制表示:

sprintf (buffer,"%d",CTRL_Z); //storing ctrl+z in 'buffer'

您不是在存储 Ctrl-Z,而是在存储字符串“26”。这是正确的:

sprintf (buffer,"%c",CTRL_Z); //storing ctrl+z in 'buffer'