为什么在 char 数组的字符之间插入“\000”字符?

Why are "\000" characters being inserted between characters of a char array?

我正在尝试从 UART 读取传入的数据流,并尝试将收到的每个字符添加到 char 的数组中,直到收到字符 \r\n(按此顺序)。

我已经编写了一个函数 (char read_uart()) 来等待 return 接收到单个字符。此函数正确地接收并 returns 单个字符,正如它应该的那样。

在这个函数之上,我尝试创建另一个函数,它应该读取每个字符并将它们添加到数组中,直到收到终止组合。就是这样:

void read_full_uart(char *message[4096])
{
    char previousTwo[2] = {'[=10=]', '[=10=]'};
    for (uint16_t i = 0; !(previousTwo[0] == '\r' && previousTwo[1] == '\n'); i++)
    {
        char currentValue = read_uart();
        *(message + i) = currentValue;

        previousTwo[0] = previousTwo[1];
        previousTwo[1] = currentValue;
    }
}

我是这样称呼它的:

char message[4096];
read_full_uart(&message);

但是,例如传输“比特币”时,message结果是这样的:

b[=17=]0[=17=]0[=17=]0i[=17=]0[=17=]0[=17=]0t[=17=]0[=17=]0[=17=]0c[=17=]0[=17=]0[=17=]0o[=17=]0[=17=]0[=17=]0i[=17=]0[=17=]0[=17=]0n[=17=]0[=17=]0[=17=]0\r[=17=]0[=17=]0[=17=]0\n[=17=]0[=17=]0[=17=]0

接收到的字符是完整的,但附加了三个 [=18=]0 个字符。

我想知道为什么会发生这种情况,以及如何调整它以便不插入这些额外的字符。

这里有两个问题。

首先,您传递给函数的不是它所期望的。 &message 的类型为 char (*)[4096],即指向 char 大小为 4096 的数组的指针。同时,该函数需要一个 char *[4096],即 char * 大小为 4096 的数组。这是类型不匹配。

第二个是这一行:

*(message + i) = currentValue;

或等效地:

message[i] = currentValue;

您正在将 char 分配给 char * 类型的数组。这也是类型不匹配。

这个问题应该被编译器作为警告发现。如果不是,请通过传递选项 -Wall -Wextra(假设 gcc)来提高警告级别并将警告视为错误。

您可以通过更改函数以获取 char:

的数组来修复这些错误
void read_full_uart(char message[4096])

或等效地:

void read_full_uart(char *message)

并通过将数组直接传递给函数:

read_full_uart(message);