AT命令响应解析器

时间:2018-08-21 23:00:26

标签: c++ c command at-command

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

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

比较功能

RLMArray<SyncUser>

使用AT或AT + CPIN等AT命令对我来说效果很好?调制解调器的最后一个响应是“ OK”,中间没有任何响应,但是它不能与AT + CREG?这样的命令一起使用,它在哪里响应:

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;

我正在选择“ + REG:n,n”,但我认为strncpy的速度非常慢,并且我的缓冲区数据已替换为“ OK”

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

中断句柄:

+REG: n,n 
OK

您知道什么比strcmp快吗?还是可以改善AT命令响应阅读的内容?

2 个答案:

答案 0 :(得分:0)

它具有XY Problem

的气味

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

答案 1 :(得分:0)

将数据移出接收缓冲区,然后将其放置在另一个缓冲区中。很少有两个缓冲区,因此请创建一个缓冲区池。过去,我使用预分配缓冲区的链表来减少碎片,但是取决于您的微控制器中的内存管理和缓存智能以及您选择使用的语言,可能std::deque的某些方面是更好的选择。

所以

列出可用缓冲区。

当UART处理线程循环看起来像

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

重复直到终止。如果清空空闲列表,则您的程序可能仍然太慢而无法跟上。也许增加更多的缓冲区将使程序可以度过忙碌的一段时间,但是如果数据流相对恒定并且空闲列表为空...那么,您就有问题了。

解析器循环也会重复进行,直到终止为止:

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

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