Доброго всем времени суток.
Недавно возникла необходимость передавать и читать данные от устройства через com порт.
в программе реализован QTimer по сигналу от которого происходит вызов следующего кода
void MainWindow::onDataGetTaimer()
{
short ADCDATA;
int i=0;
QByteArray Data,DATA1;
DATA1.clear();
Data+=(char)0x00;
ComDevice->write(Data);
ComDevice->waitForBytesWritten(1);
while(DATA1.size()<1)
{
if(ComDevice->waitForReadyRead(1))
{
DATA1+=ComDevice->read(1);
}
i++;
if(i>1000)
{
MessageBox1->setIcon(QMessageBox::Critical);
MessageBox1->setText("Data get error");
MessageBox1->setDefaultButton(QMessageBox::Ok);
MessageBox1->show();
}
}
i=0;
DATA1.clear();
Data.clear();
Data+=(char)0x83;
Data+=(char)0x03;
ComDevice->write(Data);
ComDevice->waitForBytesWritten(1);
while(DATA1.size()<3)
{
if(ComDevice->waitForReadyRead(1))
{
DATA1+=ComDevice->readAll();
}
i++;
if(i>1000)
{
MessageBox1->setIcon(QMessageBox::Critical);
MessageBox1->setText("Data get error");
MessageBox1->setDefaultButton(QMessageBox::Ok);
MessageBox1->show();
}
}
GetByte(SILow,ADCDATA)=DATA1[1];
GetByte(SIHigh,ADCDATA)=DATA1[2];
DATA1.clear();
Data.clear();
}
Для настройки порта создал удобный удобный виджет. Далее приведу код данного виджета; основная инициализация происходит в ComInitDialog::OnOkButtonPress().
ComInitDialog::ComInitDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ComInitDialog)
{
ui->setupUi(this);
//Настраиваю интерфейс
ui->BRComboBox->setEditable(true);
//Соединяю сигналы и слоты
connect(ui->OkButton,SIGNAL(clicked()),this,SLOT(OnOkButtonPress()));
connect(ui->CancelButton,SIGNAL(clicked()),this,SLOT(OnCancelButtonPress()));
//ui->comboBox->setFrame(QFrame::HLine|QFrame::Raised);
//ComDevice->setBaudRate()
ComDevice=NULL;
}
ComInitDialog::~ComInitDialog()
{
delete ui;
}
//Задаёт порт который необходимо настроить
void ComInitDialog::SetDevice(AbstractSerial *Device)
{
ComDevice=Device;
//Device->setReadBufferSize(500);
//ui->BRComboBox->clear();
//ui->BRComboBox->addItems(ComDevice->listBaudRate());
ui->DataComboBox->clear();
ui->DataComboBox->addItems(ComDevice->listDataBits());
ui->DataComboBox->removeItem(0);
ui->ParityComboBox->clear();
ui->ParityComboBox->addItems(ComDevice->listParity());
ui->ParityComboBox->removeItem(0);
ui->StopBitComboBox->clear();
ui->StopBitComboBox->addItems(ComDevice->listStopBits());
ui->StopBitComboBox->removeItem(0);
ui->FlowControlComboBox->clear();
ui->FlowControlComboBox->addItems(ComDevice->listFlowControl());
ui->FlowControlComboBox->removeItem(0);
}
//Задаёт порт который необходимо настроить и вызывает окно настройки порта
void ComInitDialog::InitDevice(AbstractSerial *Device)
{
ComDevice=Device;
show();
}
//Обработка нажатия на кнопку OK
void ComInitDialog::OnOkButtonPress()
{
bool ok=true;
if(ComDevice==NULL)
{
MessageBox1.setIcon(QMessageBox::Critical);
MessageBox1.setText("ComDevice is null!!!");
MessageBox1.setDefaultButton(QMessageBox::Ok);
MessageBox1.show();
return;
}
//Освобождаю порт если уже был занят
if(ComDevice->isOpen()){ComDevice->close();}
//Пытаюсь захватить выбранный порт
ComDevice->setDeviceName(ui->PortComboBox->currentText());
//Открываю порт для чтения и записи
if(!ComDevice->open(AbstractSerial::ReadWrite))
{
MessageBox1.setIcon(QMessageBox::Critical);
MessageBox1.setText("Can't open port!!!");
MessageBox1.setDefaultButton(QMessageBox::Ok);
MessageBox1.show();
return;
}
if(!ComDevice->setBaudRate(ui->BRComboBox->currentText().toInt(&ok,10)))
{
ComDevice->listBaudRate();
ComDevice->close();
MessageBox1.setIcon(QMessageBox::Critical);
MessageBox1.setText("baud rate set error!!!");
MessageBox1.setDefaultButton(QMessageBox::Ok);
MessageBox1.show();
return;
}
if(!ComDevice->setDataBits(ui->DataComboBox->currentText()))
{
ComDevice->close();
MessageBox1.setIcon(QMessageBox::Critical);
MessageBox1.setText("DataBits set error!!!");
MessageBox1.setDefaultButton(QMessageBox::Ok);
MessageBox1.show();
return;
}
if(!ComDevice->setParity(ui->ParityComboBox->currentText()))
{
ComDevice->close();
MessageBox1.setIcon(QMessageBox::Critical);
MessageBox1.setText("Parity set error!!!");
MessageBox1.setDefaultButton(QMessageBox::Ok);
MessageBox1.show();
return;
}
//FlowControlComboBox
if(!ComDevice->setFlowControl(ui->FlowControlComboBox->currentText()))
{
ComDevice->close();
MessageBox1.setIcon(QMessageBox::Critical);
MessageBox1.setText("FlowControl set error!!!");
MessageBox1.setDefaultButton(QMessageBox::Ok);
MessageBox1.show();
return;
}
ComDevice->setReadBufferSize(10000);
ComDevice->setTotalReadConstantTimeout(1000);
ComDevice->setCharIntervalTimeout(1000);
close();
}
//Обработка нажатия на кнопку Cancel
void ComInitDialog::OnCancelButtonPress()
{
close();
}
ну и приведу код основной инициализации главного окна.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MessageBox1=new QMessageBox();
MessageBox1->setParent(this);
MessageBox1->hide();
ComDevice = new AbstractSerial();
ComDevice->setParent(this);
//ComDevice->setCharIntervalTimeout(5000);
DockPlot = new QwtDockPlot();
DockPlot->setParent(this);
addDockWidget(Qt::TopDockWidgetArea,DockPlot,Qt::Vertical);
Curve1 = new QwtPlotCurve("ISENS5");
Curve2 = new QwtPlotCurve("ISENS2");
Curve3 = new QwtPlotCurve("ISENS7");
Curve1->setRenderHint(QwtPlotItem::RenderAntialiased);
Curve1->setPen(QPen(Qt::red));
Curve2->setRenderHint(QwtPlotItem::RenderAntialiased);
Curve2->setPen(QPen(Qt::blue));
Curve3->setRenderHint(QwtPlotItem::RenderAntialiased);
Curve3->setPen(QPen(Qt::yellow));
Curve1Data = new QVector<QPointF>();
Curve2Data = new QVector<QPointF>();
Curve3Data = new QVector<QPointF>();
Dialog1 = new ComInitDialog();
Dialog1->SetDevice(ComDevice);
//Dialog1->setParent(this);
Dialog1->InitDevice(ComDevice);
DataGetTaimer = new QTimer(this);
X=0;
connect(DockPlot,SIGNAL(SendToTransClicked()),this,SLOT(DockPlotSendToTransClicked()));
connect(DockPlot,SIGNAL(TransOFFClicked()),this,SLOT(DockPlotTransOFFClicked()));
connect(DockPlot,SIGNAL(StartClicked()),this,SLOT(DockPlotStartClicked()));
connect(DockPlot,SIGNAL(StopClicked()),this,SLOT(onStopPress()));
connect(DataGetTaimer,SIGNAL(timeout()),this,SLOT(onDataGetTaimer()));
Curve1->attach(DockPlot->GetPlot());
Curve2->attach(DockPlot->GetPlot());
Curve3->attach(DockPlot->GetPlot());
}
вобщемто всё работает данные передаются и принимаются однако через какоето время комп уходит в перезагрузку. Так и не могу понять в чём дело. Подскажите пожалуйста.