This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432E401Y:奇怪的字符串操作'套接字缓冲区结果

Guru**** 2526700 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1296737/msp432e401y-weird-string-operations-results-on-socket-buffer

器件型号:MSP432E401Y

这个问题似乎与 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);
    }
}

  1. 将首次匹配的\n 存储到 BP。
  2. 将 BP 的位置存储到 i (减1以去掉\n)。
  3. 将 I 字符从 buffer 复制到 ac.recv。
  4. 将 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);只是查看后台是否有"某些情况"发生。
  • 没有其它胎面在写入该内存区域或执行相同的函数。 所有变量仅为函数级。

我在这里错过了什么?!

感谢任何人的评论!

此致
彼得

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只要看错点、 问题就已经从第1行开始、如果 recv 使用满缓冲区:

    n = NDK_recv (s、buffer、sizeof (buffer)- 1、0);