Использование QSerialPort для записи чего-либо с кавычками на последовательное устройство - PullRequest
1 голос
/ 24 марта 2020

Я пытаюсь записать команду Lua на последовательное устройство. Команда Lua содержит кавычки, с которыми мой код не ладит. Команда является частью последовательности запуска, которую я хотел бы реализовать. Мне нужно получить "wd = require" word "\ r \ n" для отправки на устройство, поэтому я попробовал это:

QByteArray const CMD_ALPHA = "wd = require \"word\" \r\n";

, но он сохранил косые черты. Если у меня нет косой черты, то код не компилируется.
CMD_ALPHA передается в функцию очередей, а затем записывается на устройство с помощью функции записи в QSerialPort. Можно ли как-нибудь отправить команду с речевыми отметками?

1 Ответ

1 голос
/ 24 марта 2020

Главное, что вам нужно знать: записанный вами массив CMD_ALPHA не содержит вообще никаких значений, соответствующих символу \.

Байт Описанный ниже массив содержит только одно значение.
Это единственное значение соответствует символу ".
Его размер равен единице:

QByteArray baWithQuoteSymbolOnly = "\"";

Причина, по которой вы видите символы \ заключается в том, что ваш инструмент вывода (вывод отладчика, терминал и т. д. c) решает показать все символы в массиве + представляют несколько символов «непечатным» способом.
Например, печатный способ вывода * Символ 1015 * - это разрыв строки, а не \ n.

Запустите приведенный ниже код для лучшего понимания.

#include <QtCore/QCoreApplication>

#include <QByteArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    /*
    The byte array below contains only 1 symbol "
    It does not contain \ symbols at all.
    Its size is equal to one.
    */
    QByteArray baWithQuoteSymbolOnly = "\"";
    qDebug() << baWithQuoteSymbolOnly.size();

    /* 
    But it can be printed with quotation characters 
    and with escaping of non-printable characters
    */
    qDebug() << baWithQuoteSymbolOnly;

    /*
    You can print it WITHOUT quotation characters 
    and WITHOUT escaping of non-printable characters
    */
    qDebug().noquote() << baWithQuoteSymbolOnly;

    QByteArray const CMD_ALPHA  = "wd = require \"word\" \r\n";
    qDebug() << CMD_ALPHA;
    qDebug().noquote() << CMD_ALPHA;

    // output every element that CMD_ALPHA array actually contains
    for (int i=0; i<CMD_ALPHA.size(); i++)
    {        
        char asciiSymbol = CMD_ALPHA.at(i);
        int value = CMD_ALPHA.at(i);

        qDebug().noquote() << "ascii symbol =" << asciiSymbol << "value in hex =" << QString::number(value, 16);
    }

    // Now see what ASCII code does backslash symbol really have
    char realBackslash = '\\';

    qDebug().noquote() << "backslash symbol =" << realBackslash 
        << "value in hex =" << QString::number(realBackslash, 16);

    return a.exec();
}

Дополнительные примечания. QByteArray - фактически класс-оболочка для хранения массива 8-битных значений. Это даже не массив символов и не строка, пока вы не решите показать его. Строка - это просто форма представления массива цифровых значений. Вывод с добавлением непечатаемых символов является своего рода представлением строк.

...