Необработанный возврат каретки & amp; Новая строка для записи в последовательный порт

Я новичок в C ++, и я пытаюсь сгенерировать строку «команда \ r \ n». Тем не менее мне нужен сырой возврат каретки & новая строка (см. код ниже). Я пробовал R «(команда \ 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);

-2

Решение

Необработанные строки в основном для ситуаций, когда вы не хочу C escape-последовательности вообще. Это особенно полезно в тех случаях, когда \ Символ используется с осмысленными целями внутри самой строки, поэтому вам не нужно избегать его на уровне языка программирования.

Например, представьте себе случай регулярных выражений POSIX или C ++ 11, которые имеют много символов со специальным значением, а также используют \ в качестве escape-символа для возврата таких символов обратно их буквальным корреспондентам в строке для сопоставления. Теперь представьте, что вы хотите проанализировать UNC-имя в стиле Windows в форме \\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++ вызов команды.

1

Другие решения

Кажется, опечатка, изменить:

string buf = "command\r\n";
write_only(fd, buff);

в

string buf = "command\r\n";
write_only(fd, buf);
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector