C++ AT命令响应解析器

C++ AT命令响应解析器,c++,c,command,at-command,C++,C,Command,At Command,我正在开发自己的实现,使用微控制器和c/c从调制解调器读取AT命令++ 但是!!总是一个但是!!在我的程序上有两个“线程”之后,第一个线程是我正在使用strcmp比较来自Moden的可能回复,我认为这非常慢 比较功能 if (strcmp(reply, m_buffer) == 0) { memset(buffer, 0, buffer_size); buffer_size = 0; memset(m_bu

我正在开发自己的实现,使用微控制器和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或AT+CPIN,这一个对我来说很好?其中调制解调器的最后一个响应是“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命令响应的读物?

这有一种


如果您已经看到缓冲区内容被过度写入,那么您可能希望查看一个将消息从RX线程传递到解析线程的方法。这样,即使在处理第一条消息时第二条消息到达,也不会遇到“缓冲区覆盖”问题。

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

所以

列出可用缓冲区

当UART处理线程循环中的

  • 从空闲列表中获取缓冲区
  • 读入缓冲区直到满或超时
  • 将缓冲区传递给解析器。
  • 解析器将缓冲区放入自己的接收列表中
  • 解析发送一个信号来唤醒它的线程
  • 重复,直到终止。如果空闲列表被清空,您的程序可能仍然太慢,无法跟上进度。也许添加更多的缓冲区可以让程序度过一个繁忙的时期,但是如果数据流相对稳定,空闲列表清空。。。嗯,你有个问题

    解析器循环也会重复,直到终止,如下所示:

  • 如果接收列表不为空,
  • 从接收列表中获取缓冲区
  • 进程缓冲区
  • 将缓冲区返回到空闲列表
  • 否则
  • 睡眠

  • 请记住,要防止不同线程并发访问列表。C11和C++ 11有很多有用的工具来帮助你。

    哪种语言,C或C++?它们是不同的语言。例如,C++有<代码> STD::String ,C没有。C++有一个关联数组或<代码> STD::MAP<代码>,C不。在C++中,可以在<代码> STD::MAP< /COD>中使用函子来帮助解析。另外,C++有“<代码> Boo.<代码>类型,所以你可以返回<代码>真< /COD>或<代码> false <代码>而不是1或0。我更喜欢使用纯C,我的问题是STRCMP没有按我想要的那样快速地被修改,而且它被新数据覆盖了,为什么你在引号中使用“线程”?实际执行情况如何?此外,您还需要某种形式的互斥,以避免对旧数据的践踏。您应该删除不使用的语言标记。混合C和C++是一个额外的头痛,我不建议这样做。