这个问题似乎与 MCU 或 SDK 无关、 但是,因为我不再知道什么可能会发生,我不能重现任何其他硬件上的问题,至少我想分享这个 Voodoo 案例,希望有人可能有一个想法...
我使用 Recv 在 TCP 套接字上接收文本消息、 另一端在一个数据包中发送一条消息、但根据时序、有时 RECT 从接收缓冲区中一次接收多于一条消息。 由于我需要逐条消息解析消息、我在缓冲区中查找包含接收到的数据"Buffer"的第一个换行符、然后我将该部分复制到包含字符串元素"ac.recv"的邮箱结构中。
"Bp = strchr (buffer、10);"应返回一个指针、指向缓冲器中字符10首次出现的位置。 但是、出于某种原因、我注意到在某些情况下、仅返回第二次 出现的情况。 下面是代码:
n = NDK_recv(s, buffer, sizeof(buffer), 0);
if (n > 1)
{
buffer[n] = 0;
Task_sleep(500);
// look for the stop-character in the buffer
bp = strchr(buffer, 10);
while (bp)
{
i = bp - buffer - 1;
strncpy(ac.recv, buffer, i);
ac.recv[i] = 0;
if (strchr(ac.recv, 10))
{
i++;
}
Mailbox_post(m_sll_in, &ac, BIOS_NO_WAIT);
bp = strchr(bp + 1, 10);
}
}
- 将首次匹配的\n 存储到 BP。
- 将 BP 的位置存储到 i (减1以去掉\n)。
- 将 I 字符从 buffer 复制到 ac.recv。
- 将 ac.recv 端接在位置 i。
在这一点上没有任何意义为什么 ac.recv 应该回收任何\n 字符,因此"strchr (ac.recv,10)"将永远不会返回除 NULL 以外的任何内容。 但确实如此!
调试器停止在第214行、在这里您有一条 I++语句:

在上面、您可以看到 I 的值为56、BP 的地址为0x20014F37、但是缓冲区在位置28 (0x20014F1A)处的第一个"10"、57 (0x20014F37) 是三个中的第二个匹配项。 

这怎么可能呢? 我已完成/排除:
- 将 strchr 函数替换为 for-loop、相同的结果。
- 在 recv 和 strchr 之间添加一个 Task_sleep (500);只是查看后台是否有"某些情况"发生。
- 没有其它胎面在写入该内存区域或执行相同的函数。 所有变量仅为函数级。
我在这里错过了什么?!
感谢任何人的评论!
此致
彼得