我正在研究自己的实现,以使用微控制器和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命令响应阅读的内容?
答案 0 :(得分:0)
它具有XY Problem
的气味如果您看到缓冲区内容被覆盖,则可能需要查看thread safe queue,以将消息从RX线程传递到解析线程。这样,即使在处理第一条消息时又收到第二条消息,也不会遇到“缓冲区覆盖”问题。
答案 1 :(得分:0)
将数据移出接收缓冲区,然后将其放置在另一个缓冲区中。很少有两个缓冲区,因此请创建一个缓冲区池。过去,我使用预分配缓冲区的链表来减少碎片,但是取决于您的微控制器中的内存管理和缓存智能以及您选择使用的语言,可能std::deque
的某些方面是更好的选择。
所以
列出可用缓冲区。
当UART处理线程循环看起来像
重复直到终止。如果清空空闲列表,则您的程序可能仍然太慢而无法跟上。也许增加更多的缓冲区将使程序可以度过忙碌的一段时间,但是如果数据流相对恒定并且空闲列表为空...那么,您就有问题了。
解析器循环也会重复进行,直到终止为止:
请记住要保护列表,以防止不同线程同时访问列表。 C11和C ++ 11有许多有用的工具可以在这里为您提供帮助。