【问题标题】:AT command response parserAT 命令响应解析器
【发布时间】:2019-01-28 04:19:27
【问题描述】:

我正在自己的实现中使用微控制器和 c/c++ 从调制解调器读取 AT 命令

但是!!总是一个但是!在我的程序上有两个“线程”之后,第一个是我使用 strcmp 比较来自 Moden 的可能回复,我认为这非常慢

比较函数

if (strcmp(reply, m_buffer) == 0)
        {
            memset(buffer, 0, buffer_size); 
            buffer_size = 0;
            memset(m_buffer, 0, m_buffer_size); 
            m_buffer_size = 0;  
            return 0;
        }
else
       return 1;

这对我来说适用于 AT 或 AT+CPIN 等 AT 命令吗?调制解调器的最后一个响应是“OK”,中间什么都没有,但它不能使用 AT+CREG 之类的命令?,它的响应是:

+REG: n,n 
OK

我期待“+REG:n,n”,但我相信 strncpy 非常慢,我的缓冲区数据被替换为“OK”

第二个“线程”,它启用 UART RX 中断并在每次接收到新数据时替换我的缓冲区数据

中断句柄:

m_buffer_size = buffer_size;
strncpy(m_buffer, buffer, buffer_size + m_buffer_size);

你知道有比 strcmp 更快的吗?或改善 AT 命令响应阅读的方法?

【问题讨论】:

  • 哪种语言,C C++?它们是不同的语言。例如,C++ 有 std::string 而 C 没有。 C++ 有一个关联数组或std::map,C 没有。在 C++ 中,您可以在 std::map 中使用 functors 来帮助解析。此外,C++ 具有 bool 类型,因此您可以返回 truefalse 而不是 1 或 0。
  • 我更喜欢使用纯 C,我的问题是 strcmp 的比较速度没有我想要的那么快,它正在被新数据覆盖
  • 为什么在引号中使用“线程”?实际执行情况如何?此外,您将需要某种形式的互斥来避免踩踏旧数据。
  • 您应该删除您不使用的语言标签。混合使用 C 和 C++ 更让人头疼,我不建议这样做。

标签: c++ c command at-command


【解决方案1】:

这有XY Problem的气味

如果您看到缓冲区内容被覆盖,您可能需要查看thread safe queue 以将消息从 RX 线程传递到解析线程。这样,即使在您处理第一条消息时第二条消息到达,您也不会遇到“缓冲区覆盖”问题。

【讨论】:

    【解决方案2】:

    将数据移出接收缓冲区并将其放入另一个缓冲区。两个缓冲区很少足够,因此创建一个缓冲区池。过去,我使用预分配缓冲区的链接列表来减少碎片,但取决于微控制器中的内存管理和缓存智能,以及您选择使用的语言,类似于std::deque 的东西可能是更好的选择。

    所以

    制作一个空闲缓冲区列表。

    当 UART 处理线程循环看起来像这样时,

    1. 从空闲列表中获取缓冲区
    2. 读入缓冲区直到满或超时
    3. 将缓冲区传递给解析器。
      1. 解析器将缓冲区放入自己的接收列表中
      2. 解析发送信号以唤醒其线程。

    重复直到终止。如果空闲列表被清空,您的程序可能仍然太慢而无法跟上。或许添加更多的缓冲区可以让程序度过忙碌的时期,但如果数据流相对恒定,空闲列表被清空……那么,你就有问题了。

    解析器循环也会重复,直到终止看起来像:

    1. 如果接收列表不为空,
      1. 从接收列表中获取缓冲区
      2. 进程缓冲区
      3. 将缓冲区返回到空闲列表
    2. 否则
      1. 睡觉

    请记住保护列表免受不同线程的并发访问。 C11 和 C++11 有许多有用的工具可以在这里为您提供帮助。

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多