Я пытаюсь прочитать 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 ".
Спасибо, что читаете меня, извините за мой плохой английский, приветствуются также исправления языка.