mirror of
https://github.com/espressif/esp-idf
synced 2025-03-10 09:39:10 -04:00
Merge branch 'Bugfix/pppos_sms_method' into 'master'
esp_modem: Fixed send data and wait for prompt fail from DCE Closes IDFGH-4613 and IDFGH-4853 See merge request espressif/esp-idf!12147
This commit is contained in:
commit
9045d9b652
@ -77,6 +77,7 @@ struct modem_dce {
|
||||
char name[MODEM_MAX_NAME_LENGTH]; /*!< Module name */
|
||||
char oper[MODEM_MAX_OPERATOR_LENGTH]; /*!< Operator name */
|
||||
uint8_t act; /*!< Access technology */
|
||||
const char *prompt; /*!< Modem prompt string */
|
||||
modem_state_t state; /*!< Modem working state */
|
||||
modem_mode_t mode; /*!< Working mode */
|
||||
modem_dte_t *dte; /*!< DTE which connect to DCE */
|
||||
|
@ -329,6 +329,22 @@ err:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle response from send data and wait from prompt.
|
||||
*/
|
||||
static esp_err_t esp_modem_dte_send_wait_default_handler(modem_dce_t *dce, const char *line)
|
||||
{
|
||||
esp_err_t err = ESP_FAIL;
|
||||
if (!strncmp(line, dce->prompt, strlen(dce->prompt))) {
|
||||
dce->state = MODEM_STATE_SUCCESS;
|
||||
err = dce->dte->process_cmd_done(dce->dte);
|
||||
} else {
|
||||
dce->state = MODEM_STATE_FAIL;
|
||||
err = dce->dte->process_cmd_done(dce->dte);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Send data and wait for prompt from DCE
|
||||
*
|
||||
@ -346,22 +362,20 @@ static esp_err_t esp_modem_dte_send_wait(modem_dte_t *dte, const char *data, uin
|
||||
{
|
||||
MODEM_CHECK(data, "data is NULL", err_param);
|
||||
MODEM_CHECK(prompt, "prompt is NULL", err_param);
|
||||
modem_dce_t *dce = dte->dce;
|
||||
MODEM_CHECK(dce, "DTE has not yet bind with DCE", err_param);
|
||||
esp_modem_dte_t *esp_dte = __containerof(dte, esp_modem_dte_t, parent);
|
||||
// We'd better disable pattern detection here for a moment in case prompt string contains the pattern character
|
||||
uart_disable_pattern_det_intr(esp_dte->uart_port);
|
||||
// uart_disable_rx_intr(esp_dte->uart_port);
|
||||
MODEM_CHECK(uart_write_bytes(esp_dte->uart_port, data, length) >= 0, "uart write bytes failed", err_write);
|
||||
uint32_t len = strlen(prompt);
|
||||
uint8_t *buffer = calloc(len + 1, sizeof(uint8_t));
|
||||
int res = uart_read_bytes(esp_dte->uart_port, buffer, len, pdMS_TO_TICKS(timeout));
|
||||
MODEM_CHECK(res >= len, "wait prompt [%s] timeout", err, prompt);
|
||||
MODEM_CHECK(!strncmp(prompt, (const char *)buffer, len), "get wrong prompt: %s", err, buffer);
|
||||
free(buffer);
|
||||
// We'd better change pattern detection here for a moment in case prompt string contains the pattern character
|
||||
uart_enable_pattern_det_baud_intr(esp_dte->uart_port, ' ', 1, MIN_PATTERN_INTERVAL, MIN_POST_IDLE, MIN_PRE_IDLE);
|
||||
dce->prompt = prompt;
|
||||
dce->handle_line = esp_modem_dte_send_wait_default_handler;
|
||||
MODEM_CHECK(dte->send_cmd(dte, data, timeout) == ESP_OK, "wait for prompt timeout", err);
|
||||
MODEM_CHECK(dce->state == MODEM_STATE_SUCCESS, "wait for prompt failed", err);
|
||||
dce->prompt = NULL;
|
||||
uart_enable_pattern_det_baud_intr(esp_dte->uart_port, '\n', 1, MIN_PATTERN_INTERVAL, MIN_POST_IDLE, MIN_PRE_IDLE);
|
||||
return ESP_OK;
|
||||
err:
|
||||
free(buffer);
|
||||
err_write:
|
||||
dce->prompt = NULL;
|
||||
uart_enable_pattern_det_baud_intr(esp_dte->uart_port, '\n', 1, MIN_PATTERN_INTERVAL, MIN_POST_IDLE, MIN_PRE_IDLE);
|
||||
err_param:
|
||||
return ESP_FAIL;
|
||||
|
@ -59,7 +59,7 @@ static esp_err_t example_handle_cmgs(modem_dce_t *dce, const char *line)
|
||||
|
||||
#define MODEM_SMS_MAX_LENGTH (128)
|
||||
#define MODEM_COMMAND_TIMEOUT_SMS_MS (120000)
|
||||
#define MODEM_PROMPT_TIMEOUT_MS (10)
|
||||
#define MODEM_PROMPT_TIMEOUT_MS (100)
|
||||
|
||||
static esp_err_t example_send_message_text(modem_dce_t *dce, const char *phone_num, const char *text)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user