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++ 命令调用。