Raw Carriage Return & 串行端口写入的新行
Raw Carriage Return & New Line for Serial Port Write
我是 C++ 新手,我正在尝试生成一个字符串 "command\r\n"。但是,我需要一个原始运输 return 和换行符(请参见下面的代码)。我试过 R"(command\r\n)",但我认为我没有使用原始字符串的正确版本。有哪些替代选项(使用 Linux)?
这是代码:我正在尝试使用字符串命令写入串行端口。控制器需要 \r\n。
//serial port write function
int write_only(int fd, string str) {
if (write(fd, str.c_str(), str.length()) == -1)
{
printf("write failed \n");
}
}
// this call works
write_only(fd, "command\r\n");
此调用不起作用,但我需要它以便轻松生成命令:
string buff = "command\r\n";
write_only(fd, buff);
好像打错了,改成:
string buf = "command\r\n";
write_only(fd, buff);
到
string buf = "command\r\n";
write_only(fd, buf);
原始字符串主要用于您根本不需要 C 转义序列的情况。这在 \
字符在字符串本身内部用于有意义的目的的情况下特别有用,因此您不必在编程语言级别转义它。
例如,想象一下 POSIX 或 C++11 正则表达式的情况,其中有许多具有特殊含义的字符,并且还使用 \
作为转义字符来还原这些字符到要匹配的字符串中的文字对应者。现在假设您要解析 Windows 格式的 UNC 名称,格式为 \computer\share\pathname\filename
。比较拆分这四个组件的两种可能方式。
// With C-style strings: every "\" in the string to be parsed requires
// "\" in regex level, and every "\" in regex level requires "\" in
// language level.
regex unc_parser1("^\\\\([A-Za-z0-9._-]+)\\([^\\]+)\\((.*)\\)?([^\\]+)$");
// With raw strings: each desired "\" has to be escaped only in regex level.
regex unc_parser2(R"(^\\([A-Za-z0-9._-]+)\([^\]+)\((.*)\)?([^\]+)$)");
(当然,事情可以比这个简单的例子复杂很多...)
从积极的方面来说,解决您的问题的一种可能方法是使用简单的编译时字符串连接。例如,下面的所有字符串都将具有相同的字符序列。
char s1[]="Line 1 has special char (\")\r\nLine 2: has special char (\)\r\nLine 3 has no special chars\r\n";
#define CRLF "\r\n"
char s2[]=
"Line 1 has special char (\")" CRLF
"Line 2: has special char (\)" CRLF
"Line 3 has no special chars" CRLF
;
char s3[]=
R"(Line 1 has special char ("))" CRLF
R"(Line 2: has special char (\))" CRLF
R"(Line 3 has no special chars)" CRLF
;
要让原始字符串在 Linux 发行版上编译,其中 C++11 还不是默认发行版(顺便说一句,我知道的所有发行版),您只需添加 -std=c++11
到您的 g++
或 clang++
命令调用。
我是 C++ 新手,我正在尝试生成一个字符串 "command\r\n"。但是,我需要一个原始运输 return 和换行符(请参见下面的代码)。我试过 R"(command\r\n)",但我认为我没有使用原始字符串的正确版本。有哪些替代选项(使用 Linux)?
这是代码:我正在尝试使用字符串命令写入串行端口。控制器需要 \r\n。
//serial port write function
int write_only(int fd, string str) {
if (write(fd, str.c_str(), str.length()) == -1)
{
printf("write failed \n");
}
}
// this call works
write_only(fd, "command\r\n");
此调用不起作用,但我需要它以便轻松生成命令:
string buff = "command\r\n";
write_only(fd, buff);
好像打错了,改成:
string buf = "command\r\n";
write_only(fd, buff);
到
string buf = "command\r\n";
write_only(fd, buf);
原始字符串主要用于您根本不需要 C 转义序列的情况。这在 \
字符在字符串本身内部用于有意义的目的的情况下特别有用,因此您不必在编程语言级别转义它。
例如,想象一下 POSIX 或 C++11 正则表达式的情况,其中有许多具有特殊含义的字符,并且还使用 \
作为转义字符来还原这些字符到要匹配的字符串中的文字对应者。现在假设您要解析 Windows 格式的 UNC 名称,格式为 \computer\share\pathname\filename
。比较拆分这四个组件的两种可能方式。
// With C-style strings: every "\" in the string to be parsed requires
// "\" in regex level, and every "\" in regex level requires "\" in
// language level.
regex unc_parser1("^\\\\([A-Za-z0-9._-]+)\\([^\\]+)\\((.*)\\)?([^\\]+)$");
// With raw strings: each desired "\" has to be escaped only in regex level.
regex unc_parser2(R"(^\\([A-Za-z0-9._-]+)\([^\]+)\((.*)\)?([^\]+)$)");
(当然,事情可以比这个简单的例子复杂很多...)
从积极的方面来说,解决您的问题的一种可能方法是使用简单的编译时字符串连接。例如,下面的所有字符串都将具有相同的字符序列。
char s1[]="Line 1 has special char (\")\r\nLine 2: has special char (\)\r\nLine 3 has no special chars\r\n";
#define CRLF "\r\n"
char s2[]=
"Line 1 has special char (\")" CRLF
"Line 2: has special char (\)" CRLF
"Line 3 has no special chars" CRLF
;
char s3[]=
R"(Line 1 has special char ("))" CRLF
R"(Line 2: has special char (\))" CRLF
R"(Line 3 has no special chars)" CRLF
;
要让原始字符串在 Linux 发行版上编译,其中 C++11 还不是默认发行版(顺便说一句,我知道的所有发行版),您只需添加 -std=c++11
到您的 g++
或 clang++
命令调用。