connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(errorSerial(QSerialPort::SerialPortError)));void SendCom::errorSerial(QSerialPort::SerialPortError err){ qDebug()<<"SendCom Error: "+serial->errorString();//QString::number(err);}
#include "mainwindow.h"#include "ui_mainwindow.h"#include "sendcom.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this); QString PORT="COM4"; sendCom.setPORT(PORT);// Устанавливаем номер порта if(!sendCom.InitPort())qDebug<<"Что то не получилось с "<<PORT; qDebug()<<"Получилось подключится к "<<PORT;}
#include "sendcom.h"#include <QDebug>SendCom::SendCom(QObject *parent) : QObject(parent)//,{//qDebug("Potok SendCom telo");//qDebug()<<"Telo Thread:"<<QString::number((int)QThread::currentThreadId());}bool SendCom::InitPort(){ if(!InitSerial())return false; if(!SendAndRead()) { serial->close(); return false; } qDebug()<<PORT<<" Read:"<<QString(m_arrCom.toHex().toUpper()); serial->close(); return true;}bool SendCom::InitSerial(){ qDebug()<<"Init START "<<PORT; serial=new QSerialPort(this); serial->setPortName(PORT); serial->setBaudRate(QSerialPort::Baud38400); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); if(!serial->open(QSerialPort::ReadWrite)) { qDebug()<<"ERROR !!! Не могу открыть порт "<<PORT; return false; } connect(serial, SIGNAL(readyRead()), this, SLOT(read())); connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(errorSerial(QSerialPort::SerialPortError))); return true;}bool SendCom::SendAndRead(){ serial->clear(); w_arrCom.clear();//Очищаем массив перед подготовкой пакетаw_arrCom = QByteArray::fromHex("010404020001913A");quint8 lenRead=........;//Вычисление длины ответа от устройстваfor (quint8 i=0;i<2;i++)//Две попытки отправки запроса и получения ответа{ qDebug()<<"Попытка №"<<QString::number(i+1); serial->write(w_arrCom);// Запись в последовательный порт this->thread()->msleep(qCeil(150));// Засыпаем, ожидая, пока микроконтроллер обработает данные и ответит. m_arrCom.clear();//Очищаем буфер перед приёмом данныхserial->waitForReadyRead(300);//Без этой команды данные не приходят в буфер от слова СОВСЕМ))) if (m_arrCom.size()==lenRead) break; else{ qDebug<<"Ответ не подходит по длине Bytes read: "<<QString::number(m_arrCom.size()) <<" lenRead:"<<QString::number(lenRead);} serial->clear();}if (m_arrCom.size()!=lenRead) return false;return true;}void SendCom::read(){//qDebug()<< "Доступно: "<<serial->bytesAvailable(); m_arrCom += serial->readAll();}void SendCom::errorSerial(QSerialPort::SerialPortError err){ qDebug()<<"SendCom Error: "+serial->errorString();//QString::number(err);}void SendCom::setPORT(QString m_PORT){ if (PORT == m_PORT) return; PORT = m_PORT;}