问题描述
我正在尝试从 UART 读取传入的数据流,并尝试将收到的每个字符添加到 char
数组中,直到收到字符 \r
和 \n
(在那个订单)。
我编写了一个函数 (char read_uart()
) 来等待接收到单个字符时返回。此函数正确接收并返回单个字符,因为它应该。
在此函数之上,我尝试创建另一个函数,它应该读取每个字符并将它们添加到数组中,直到收到终止组合。就是这样:
void read_full_uart(char *message[4096])
{
char prevIoUsTwo[2] = {'\0','\0'};
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\000\000\000i\000\000\000t\000\000\000c\000\000\000o\000\000\000i\000\000\000n\000\000\000\r\000\000\000\n\000\000\000
字符被完整接收,但附加了三个 \000
字符。
我想知道为什么会发生这种情况,以及如何调整它以便不插入这些额外的字符。
解决方法
这里有两个问题。
首先,您传递给函数的不是它所期望的。 &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);