微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为新行编写函数

如何解决如何为新行编写函数

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

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

就像我有30条以上的AT命令一样,可以序列化输出。 所以我有一个问题 我尝试制作一个像这样的新字符串

   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_Norn返回所需的指针大小

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);
}

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


然后您可以这样称呼它:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。