#include <QVector>
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
comPara.state = true;
this->Serial_FindAvailablePort();
myThread = new TestThread();
qDebug()<<"main thread!:"<<QThread::currentThreadId();
}
Widget::~Widget()
{
delete ui;
}
void Widget::Serial_FindAvailablePort()
{
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->serialNumboBox->addItem(serial.portName());
serial.close();
}
}
}
void Widget::Com_GetParameters()
{
comPara.portName = ui->serialNumboBox->currentText();
//立即设置串口名,以便判断是否能打开。
serial.setPortName(comPara.portName);
comPara.baudRate = ui->baudComboBox->currentText().toInt();
comPara.dataBits = ui->dataComboBox->currentIndex();
comPara.stopBits = ui->stopComboBox->currentIndex();
comPara.parity = ui->checkComboBox->currentIndex();
comPara.isRTSCTS = ui->rtsRadioButton->isChecked();
comPara.isDTSCTS = ui->dtrRadioButton->isChecked();
}
void Widget::comDataAnalyze()
{
QByteArray stream = serial.readAll();
//处理stream。解封包
if(!stream.isEmpty())
{
//ui->RecvTextEdit->clear();
/* 把接受到的数据显示到界面上 */
stream.append(serial.readAll());
ui->RecvTextEdit->setText(stream);
}
}
void Widget::handleSerialError(QSerialPort::SerialPortError error)
{
if (error == QSerialPort::ResourceError)
{
//disconnect(&serial,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(handleSerialError(QSerialPort::SerialPortError)));
//关闭解析子线程
myThread->stop();
serial.close();
QMessageBox::critical(this,QString::fromLocal8Bit("错误"),QString::fromLocal8Bit("串口连接中断,请检查是否正确连接!"));
}
}
void Widget::on_comSwitchPushButton_clicked()
{
if(comPara.state)
{
comPara.state = false;
//获取当前空间中的参数
this->Com_GetParameters();
serial.open(QIODevice::ReadWrite);//打开串口
if(!serial.isOpen())//判断串口是否打开
{
QMessageBox::information(this,QString::fromLocal8Bit("错误"),QString::fromLocal8Bit("当前串口号已经被占用,或者其他错误!!!"));
return;
}
//改变按键名称。
ui->comSwitchPushButton->setText(QString::fromLocal8Bit("关闭串口"));
//失去能串口设置。
ui->serialNumboBox->setEnabled(false);
ui->baudComboBox->setEnabled(false);
ui->dataComboBox->setEnabled(false);
ui->stopComboBox->setEnabled(false);
ui->checkComboBox->setEnabled(false);
ui->rtsRadioButton->setEnabled(false);
ui->dtrRadioButton->setEnabled(false);
ui->testPushButton->setEnabled(true);
ui->standPushButton->setEnabled(true);
//写入串口设置。
//设置串口名
//serial.setPortName(comPara.portName);
//设置波特率
serial.setBaudRate(comPara.baudRate);
//设置数据位数
switch(comPara.dataBits)
{
case 0: serial.setDataBits(QSerialPort::Data8); break;
case 1: serial.setDataBits(QSerialPort::Data7); break;
case 2: serial.setDataBits(QSerialPort::Data6); break;
case 3: serial.setDataBits(QSerialPort::Data5); break;
default: break;
}
//设置奇偶校验
switch(comPara.parity)
{
case 0: serial.setParity(QSerialPort::NoParity); break;
case 1: serial.setParity(QSerialPort::OddParity); break;
case 2: serial.setParity(QSerialPort::EvenParity); break;
default: break;
}
//设置停止位
switch(comPara.stopBits)
{
case 0: serial.setStopBits(QSerialPort::OneStop); break;
case 1: serial.setStopBits(QSerialPort::OneAndHalfStop);break;
case 2: serial.setStopBits(QSerialPort::TwoStop); break;
default: break;
}
//流控判断
if(comPara.isRTSCTS)
{
serial.setFlowControl(QSerialPort::HardwareControl);
}
else
{
if(comPara.isDTSCTS)
{
serial.setFlowControl(QSerialPort::NoFlowControl);
}
}
serial.clearError();
serial.clear();
//关联接收函数。
connect(&serial, SIGNAL(readyRead()), this, SLOT(comDataAnalyze()));
//打开串口错误检测
connect(&serial,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(handleSerialError(QSerialPort::SerialPortError)));
myThread->readyStart();
myThread->start();
}
else
{
ui->serialNumboBox->clear();
QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts();
for(int i = 0;i < list.count();i++)
{
ui->serialNumboBox->addItem(list.at(i).portName());
}
comPara.state = true;
//改变按键名称。
ui->comSwitchPushButton->setText(QString::fromLocal8Bit("打开串口"));
//失去能串口设置。
ui->serialNumboBox->setEnabled(true);
ui->baudComboBox->setEnabled(true);
ui->dataComboBox->setEnabled(true);
ui->stopComboBox->setEnabled(true);
ui->checkComboBox->setEnabled(true);
ui->rtsRadioButton->setEnabled(true);
ui->dtrRadioButton->setEnabled(true);
ui->testPushButton->setEnabled(false);
ui->standPushButton->setEnabled(false);
//断开串口错误检测
//disconnect(&serial,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(handleSerialError(QSerialPort::SerialPortError)));
//停止串口解析线程
myThread->stop();
//关闭串口
serial.close();
}
}