如何为新行编写函数

how to write a function for new line

我正在使用一些 AT 终端开发 C 程序,需要我的代码来定义许多字符串变量,例如:

const char  *AT_norn           = "AT";
const char  *AT                = "AT\r\n";
const char  *ATI               = "ATI\r\n";

就像我有 30 个或更多像上面那样的 AT 命令到 Serialprint 输出。 所以我有问题, 我尝试制作一个新的字符串

   const char  *myeol                = "\r\n";

IN 命令发出“AT\r\n”

我试过写这样的东西,但没有成功:

UART_write(handle, AT_norn, sizeof(AT_norn));
UART_write(handle, myeol, sizeof(myeol));

如何使用上述方法节省一些 RAM 大小?

定义 AT_norn

const char  *AT_norn           = "AT";

sizeof AT_Nornreturns一个指针的大小,你要

const char  AT_norn[]           = "AT";

为了得到数组的大小

如前所述,sizeof 在您的方法中不起作用,因为它将评估指针的大小,而不是它指向的字符串文字。


如果您的目的是减少 RAM 使用,您可以用宏替换变量。

#define AT  "AT"
#define ATI "ATI"

这将删除 RAM 中的指针变量。 字符串本身可能位于 ROM 中。

根据编译器和链接器的聪明程度,您的指针可能会包含在最终的二进制文件中,即使它们没有被使用。

定义宏会导致只包含那些实际使用的字符串。 编译器应将文件中多次使用的字符串存储在同一位置。

这也允许您使用 sizeof,因为 sizeof 计算出用于存储字符串文字的字符数。

这也适用于 David 的回答中建议的数组。


然后您可以通过添加一个为您执行此操作的新函数来完全消除存储 EOL 的需要:

void UART_write_AT(int handle, unsigned char *buf, size_t len) {
  UART_write(handle, buf, len);
  UART_write(handle, "\r\n", 2);
}

我没有检查正确的参数类型或 return 值。您可以根据自己的需要进行调整。


那么你可以这样称呼它:

UAR_write_AT(handle,ATI,sizeof(ATI)-1);

请注意 -1,因为 sizeof 包含不应发送到 UART 的字符串文字的终止 0 字节。