Kaynağa Gözat

【修复】"+++" 命令格式,是否忽略CR字符可选
【增加】清除串口缓存区

Signed-off-by: liuxianliang <liuxianliang@rt-thread.com>

liuxianliang 6 yıl önce
ebeveyn
işleme
8c01b92da4
2 değiştirilmiş dosya ile 14 ekleme ve 3 silme
  1. 1 0
      inc/ppp_chat.h
  2. 13 3
      src/ppp_chat.c

+ 1 - 0
inc/ppp_chat.h

@@ -35,6 +35,7 @@ struct modem_chat_data {
     rt_uint8_t expect;      // use CHAT_RESP_xxx
     rt_uint8_t retries;
     rt_uint8_t timeout;     // second
+    rt_uint8_t ignore_cr;
 };
 
 

+ 13 - 3
src/ppp_chat.c

@@ -116,6 +116,14 @@ static rt_size_t chat_read_until(rt_device_t serial, void *buffer, rt_size_t siz
     return rt_device_read(serial, 0, buffer, size);
 }
 
+static void modem_flush_rx(rt_device_t serial)
+{
+    char rdbuf[CHAT_READ_BUF_MAX];
+
+    while (rt_device_read(serial, 0, rdbuf, CHAT_READ_BUF_MAX))
+    {}
+}
+
 /*
  * modem_chat_once , send an order to control modem
  *
@@ -134,9 +142,11 @@ static rt_err_t modem_chat_once(rt_device_t serial, const struct modem_chat_data
 
     if (data->transmit)
     {
-        LOG_D(CHAT_DATA_FMT" transmit --> modem", CHAT_DATA_STR(data));
+        LOG_D(CHAT_DATA_FMT " transmit --> modem", CHAT_DATA_STR(data));
         rt_device_write(serial, 0, data->transmit, rt_strlen(data->transmit));
-        rt_device_write(serial, 0, "\r", 1);
+
+        if (rt_strncmp("+++", data->transmit, 3) && data->ignore_cr == RT_TRUE)
+            rt_device_write(serial, 0, "\r", 1);
     }
 
     if (data->expect == MODEM_CHAT_RESP_NOT_NEED)
@@ -189,6 +199,7 @@ static rt_err_t modem_chat_internal(rt_device_t serial, const struct modem_chat_
         LOG_D(CHAT_DATA_FMT" running", CHAT_DATA_STR(&data[i]));
         for (retry_time = 0; retry_time < data[i].retries; retry_time++)
         {
+            modem_flush_rx(serial);
             err = modem_chat_once(serial, &data[i]);
             if (err == RT_EOK)
                 break;
@@ -229,7 +240,6 @@ rt_err_t modem_chat(rt_device_t serial, const struct modem_chat_data *data, rt_s
         LOG_E("chat failed");
         goto __exit;
     }
-    LOG_I("chat success");
 
     serial->rx_indicate = old_rx_ind;
 __exit: