Как отправить AT-команды в переменную - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь прочитать ECU с RaspBerry Pi 3 и ELM327.Использование QTCreator для достижения этой цели.

Проблема возникает, когда я хочу установить переменную для отправки нескольких AT-команд в ELM, вызвав void, я знаю, что обязательно преобразовать QString в QByteArray, чтобы serial.write () работал иначе, если он ''Я скажу «нет подходящей функции для вызова QSerialPort :: write (QString &)». Мой вопрос: как мне это сделать?

Я уже пытался конвертировать команды в QByteArray, используя этот метод, который я нашел в previusпотоки:

QByteArray outd_c=outdata.toUft8();
QByteArray outd_c=outdata.toLatin1();

также пробовал с:

void Screenapp::ELMWrite(const QByteArray &outd_c)
{
    outd_c=outdata.toLocal8Bits();
    ELM->flush();
    if(ELM->isOpen() && ELM->isWritable())
    {          
        ELM->write(outd_c);
        if(ELM->waitForBytesWritten(500))
        {
            ui->Terminal->addItem("Sent:");
            ui->Terminal->addItem(outdat);
            ELMRead();
        }
        else
        {
            ui->Terminal->addItem("Sent: Time Out");
        }
    }
    else
    {
        ui->label->setText("ELM closed or non writable");
    }
}

, и все, что я получаю, это "Отправлено: Тайм-аут" и / или "Ответ: Ошибка чтения."

Мой код:

QSerialPort *ELM;
QString indat, outdat;
QByteArray outd_c=outdata.toUtf8(),

void Screenapp::on_ComButton_clicked()
{
    ELM = new QSerialPort(this);
    ELM->setPortName("/dev/ttyS0");
    ELM->open(QIODevice::ReadWrite);

    if(ELM->isOpen()==true){
        ELM->setBaudRate(QSerialPort::Baud38400);
        ELM->setStopBits(QSerialPort::OneStop);
        ELM->setParity(QSerialPort::NoParity);
        ELM->setDataBits(QSerialPort::Data8);
        ELM->setFlowControl(QSerialPort::NoFlowControl);
        ui->statusBar->showMessage("Connected... Baud: 38400");
        ELM->flush();
        ui->label->setText("Serial port: cleaned");
    }else{
        ui->statusBar->showMessage("Not Connected");
        ui->label->setText("Check COM");
        ELM->close();
        QMessageBox::information(this,"ELM 327 Project","Is not possible to connect with ELM");
    }
}

void Screenapp::ELMWrite(const QByteArray &outd_c)
{
    ELM->flush();
    if(ELM->isOpen() && ELM->isWritable())
    {          
        ELM->write(outd_c);
        if(ELM->waitForBytesWritten(500))
        {
            ui->Terminal->addItem("Sent:");
            ui->Terminal->addItem(outdat);
            ELMRead();
        }
        else
        {
            ui->Terminal->addItem("Sent: Time Out");
        }
    }
    else
    {
        ui->label->setText("ELM closed or non writable");
    }
}

void Screenapp::ELMRead()
{
    if(ELM->isOpen() /*&& ELM->isReadable()*/)
    {
        if(ELM->waitForReadyRead(500))
        {
            indat = ELM->read(26);
            while (ELM->waitForReadyRead(500))
                indat +=ELM->read(26);
            indat = indat.simplified();
            ui->Terminal->addItem("Response:");
            ui->Terminal->addItem(indat);
        }
        else
        {
            ui->Terminal->addItem("Response: Read fail");
        }
    }
    else
    {
        ui->Terminal->addItem("ELM is not readable");
    }
}

void Screenapp::on_ATButton_clicked()
{
    ui->Terminal->clear();
    outdat="ATZ/r";
    ELMWrite();
    outdat="ATE0/r";
    ELMWrite();
    outdat="ATRV/r";
    ELMWrite();
    outdat="ATCSM0/r";
    ELMWrite();
    outdat="ATJE/r";
    ELMWrite();
    outdat="ATCS/r";
    ELMWrite();
    outdat="ATSPA/r";
    ELMWrite();
    outdat="ATPA4201/r";
    ELMWrite();
    outdat="ATDP/r";
    ELMWrite();
    outdat="ATDM1/r";
    ELMWrite();
}

Для первой команды я ожидаю вывод:

ATZ

ELM327 V2.2

, а для других команд я ожидаю «ОК», но фактический вывод «Отправлено:Time out ".

Спасибо, что читаете меня, извините за мой плохой английский, приветствуются также исправления языка.

...