From e3879313442306d6c544d2b514a8c538121f659a Mon Sep 17 00:00:00 2001 From: cxh Date: Sun, 4 Jan 2026 17:24:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E9=94=99=E8=AF=AF=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/{serail_AT.hpp => serial_AT.hpp} | 2 + src/serial_AT.cpp | 101 ++++++++--------------- 2 files changed, 38 insertions(+), 65 deletions(-) rename include/{serail_AT.hpp => serial_AT.hpp} (79%) diff --git a/include/serail_AT.hpp b/include/serial_AT.hpp similarity index 79% rename from include/serail_AT.hpp rename to include/serial_AT.hpp index bf9efb9..9d3cd20 100644 --- a/include/serail_AT.hpp +++ b/include/serial_AT.hpp @@ -3,3 +3,5 @@ #include "serial_port.h" void init_serial_at(const std::string& device, int baudrate); + +extern std::string IMEI; diff --git a/src/serial_AT.cpp b/src/serial_AT.cpp index 3db0b20..a28c302 100644 --- a/src/serial_AT.cpp +++ b/src/serial_AT.cpp @@ -1,86 +1,64 @@ #include #include #include +#include #include -#include "serail_AT.hpp" +#include "serial.hpp" // ================== 全局 IMEI ================== -std::string IMEI = ""; // 一般 15 位 +std::string IMEI; // 一般 15 位 // ================== AT 任务结构 ================== struct AtTask { std::string cmd; - int interval; // 周期,秒;0 表示一次性任务 - int max_retries; // -1 表示无限次 + int max_retries; int sent_count; std::chrono::steady_clock::time_point last_sent; }; static std::unique_ptr serial_at; static std::thread serial_at_sender; - static std::mutex at_tasks_mutex; -// ================== AT 任务列表 ================== -static std::vector at_tasks = { - {"AT+GSN", 0, 3, 0, {}} // 查询 IMEI,最多重试 3 次 -}; +// 只保留一个任务:AT+GSN +static std::vector at_tasks = {{"AT+GSN", 3, 0, {}}}; // ================== 发送线程 ================== static void serial_at_send_loop() { while (true) { - if (serial_at && serial_at->is_open()) + if (!serial_at || !serial_at->is_open()) { - auto now = std::chrono::steady_clock::now(); - std::lock_guard lock(at_tasks_mutex); + std::this_thread::sleep_for(std::chrono::seconds(1)); + continue; + } - for (auto it = at_tasks.begin(); it != at_tasks.end();) + auto now = std::chrono::steady_clock::now(); + std::lock_guard lock(at_tasks_mutex); + + for (auto it = at_tasks.begin(); it != at_tasks.end();) + { + auto& task = *it; + + if (task.sent_count >= task.max_retries) { - auto& task = *it; - bool should_send = false; - - if (task.interval > 0) - { - if (task.last_sent.time_since_epoch().count() == 0 || - std::chrono::duration_cast(now - task.last_sent).count() >= task.interval) - { - should_send = true; - } - } - else - { - if ((task.max_retries < 0 || task.sent_count < task.max_retries) && - (task.last_sent.time_since_epoch().count() == 0 || - std::chrono::duration_cast(now - task.last_sent).count() >= 5)) - { - should_send = true; - } - else if (task.max_retries > 0 && task.sent_count >= task.max_retries) - { - LOG_ERROR("[serial_at] AT+GSN reached max retries"); - - // IMEI 获取失败,仍继续初始化 - init_tcp_client_tbox_router(TboxConfigManager::instance().getPlatformIp(), - TboxConfigManager::instance().getPlatformPort()); - - it = at_tasks.erase(it); - continue; - } - } - - if (should_send) - { - serial_at->send_data(task.cmd + "\r\n"); - task.sent_count++; - task.last_sent = now; - } - - ++it; + // 达到最大重试次数,直接移除 + it = at_tasks.erase(it); + continue; } + + if (task.last_sent.time_since_epoch().count() == 0 || + std::chrono::duration_cast(now - task.last_sent).count() >= 5) + { + serial_at->send_data(task.cmd + "\r\n"); + task.sent_count++; + task.last_sent = now; + } + + ++it; } std::this_thread::sleep_for(std::chrono::seconds(1)); @@ -90,31 +68,24 @@ static void serial_at_send_loop() // ================== 接收处理 ================== static void handle_serial_at_data(const std::string& data) { - // 拆行处理,避免粘包 std::istringstream iss(data); std::string line; while (std::getline(iss, line)) { - // 去空白 + // trim line.erase(0, line.find_first_not_of(" \t\r\n")); line.erase(line.find_last_not_of(" \t\r\n") + 1); - // IMEI 通常是 15 位纯数字 + // IMEI:14~17 位纯数字(不同模组略有差异) if (line.size() >= 14 && line.size() <= 17 && std::all_of(line.begin(), line.end(), ::isdigit)) { IMEI = line; + LOG_INFO("[serial_at] IMEI = " + IMEI); - LOG_INFO("[serial_at] Extracted IMEI = " + IMEI); - - init_tcp_client_tbox_router(TboxConfigManager::instance().getPlatformIp(), - TboxConfigManager::instance().getPlatformPort()); - - // 移除 AT+GSN 任务 + // 成功后清空任务,不再发送 AT std::lock_guard lock(at_tasks_mutex); - at_tasks.erase(std::remove_if(at_tasks.begin(), at_tasks.end(), - [](const AtTask& task) { return task.cmd == "AT+GSN"; }), - at_tasks.end()); + at_tasks.clear(); return; } }