⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qtcomassist.cpp

📁 Visual C++串口通信开发入门与编程实践
💻 CPP
字号:
#include "qtcomassist.h"
#include <iostream>

using namespace std;

#define INIT_CBB(_ctl,_lst) \
	for (int i=0;i<_lst.size();i++) \
	{	\
		_ctl->addItem(_lst.at(i).first); \
	}\



QtComAssist::QtComAssist(QWidget *parent, Qt::WFlags flags)
	: QDialog(parent, flags)
{
	ui.setupUi(this);

#ifdef WIN32
	lst_Device.append(DevicePair("COM1","COM1"));
	lst_Device.append(DevicePair("COM2","COM2"));
	lst_Device.append(DevicePair("COM3","COM3"));
	lst_Device.append(DevicePair("COM4","COM4"));
	lst_Device.append(DevicePair("COM5","COM5"));
	lst_Device.append(DevicePair("COM6","COM6"));

	INIT_CBB(ui.cbbDevice,lst_Device);
#endif

	lst_baudrate.append(BaudRatePair("9600",BAUD9600));
	lst_baudrate.append(BaudRatePair("19200",BAUD19200));
	lst_baudrate.append(BaudRatePair("115200",BAUD115200));

	INIT_CBB(ui.cbbBaudrate,lst_baudrate);
	
	lst_parity.append(ParityPair(tr("none"),PAR_NONE));
	lst_parity.append(ParityPair(tr("odd"),PAR_ODD));
	lst_parity.append(ParityPair(tr("even"),PAR_EVEN));

	INIT_CBB(ui.cbbParity,lst_parity);

	lst_databits.append(DataBitsPair("8",DATA_8));
	lst_databits.append(DataBitsPair("7",DATA_7));
	lst_databits.append(DataBitsPair("6",DATA_6));
	lst_databits.append(DataBitsPair("5",DATA_5));

	INIT_CBB(ui.cbbDatabits,lst_databits);

	lst_stopbits.append(StopBitsPair("1",STOP_1));
	lst_stopbits.append(StopBitsPair("2",STOP_2));

	INIT_CBB(ui.cbbStop,lst_stopbits);

	connect(&m_SerialPort,
		SIGNAL(bytesWritten(qint64)),
		this,
		SLOT(sl_Send_finish()));

	m_progress= new QProgressDialog(
				tr("Sending data..."), tr("Abort"), 0, 0, this
			);
	
	connect(m_progress,
			SIGNAL(canceled()),
			this,
			SLOT(sl_Send_abort()));



	connect(&timer,SIGNAL(timeout()),this,SLOT(onTimer()));

	ui.chbRecDisplay->setChecked(true);

	connect(&m_SerialPort,
			SIGNAL(readyRead()),
			this,
			SLOT(sl_serial_data_received()));

	

	setDeviceOpen(false);
}

QtComAssist::~QtComAssist()
{
	delete m_progress;
}

void QtComAssist::setDeviceOpen(bool open)
{
	if (open)
	{
		m_DeviceOpened = true;
		ui.btnDeviceOC->setText(tr("&Close"));
		ui.btnSend->setDisabled(false);
	}
	else
	{
		m_DeviceOpened = false;
		ui.btnDeviceOC->setText(tr("&Open"));
		ui.btnSend->setDisabled(true);	
	}
}
void QtComAssist::on_btnDeviceOC_clicked()
{
	if (m_DeviceOpened==false)
	{
		m_SerialPort.setPortName(ui.cbbDevice->currentText());
		m_SerialPort.setQueryMode(QextSerialPort::EventDriven);
		m_SerialPort.setBaudRate(
					lst_baudrate.at(ui.cbbBaudrate->currentIndex()).second
				);
		m_SerialPort.setFlowControl(FLOW_OFF);
		m_SerialPort.setParity(
					lst_parity.at(ui.cbbParity->currentIndex()).second
				);
		m_SerialPort.setDataBits(
					lst_databits.at(ui.cbbDatabits->currentIndex()).second	
				);
		m_SerialPort.setStopBits(
					lst_stopbits.at(ui.cbbStop->currentIndex()).second	
				);
		m_SerialPort.open(QIODevice::ReadWrite);
		if (!(m_SerialPort.lineStatus() & LS_DSR)) {
			dispError(tr("error: device is not turned on"));
		}
		else
		{
			setDeviceOpen(true);
		}
	}
	else
	{
		m_SerialPort.close();
		setDeviceOpen(false);
	}
}


void QtComAssist::dispError(const QString & strMessage)
{
	cerr<<"ERROR: "<<qPrintable(strMessage)<<endl;
	QMessageBox::critical(this,"ERROR",strMessage);
}



void QtComAssist::on_btnSend_clicked()
{
	
	int nDelay=ui.spbSendDelay->text().toInt();
	if (nDelay==0)
	{
		QString strData = ui.edtSend->toPlainText();
		m_SerialPort.write(qPrintable(strData),strData.size());
		m_arr_data_send_size = strData.size();
	}
	else
	{
		m_arr_data_send = ui.edtSend->toPlainText().toLocal8Bit();
		m_arr_data_send_size = m_arr_data_send.size();
		m_nCurrentPos = 0;
		m_progress->setValue(0);
		m_progress->setMaximum(m_arr_data_send_size);
		m_progress->setWindowModality(Qt::WindowModal);
		m_progress->setAutoClose(true);
		m_progress->show();
		timer.setInterval(nDelay);
		timer.start();
	}

	m_IsSending = true;
	ui.btnSend->setDisabled(true);

}

void QtComAssist::onTimer()
{

	char ch = m_arr_data_send.at(m_nCurrentPos);
	m_SerialPort.write(&ch,1);

}

void QtComAssist::sl_Send_finish()
{
	if (timer.isActive())
	{
		m_nCurrentPos ++;
		m_progress->setValue(m_nCurrentPos);
		if (m_nCurrentPos == m_arr_data_send_size)
		{
			timer.stop();
		}
		else
		{
			return;
		}
	}
	m_IsSending = false;
	ui.btnSend->setDisabled(false);
}

void QtComAssist::sl_Send_abort()
{
	timer.stop();
	sl_Send_finish();
}

void QtComAssist::sl_serial_data_received()
{

	int bytesRead;
	do 
	{

		bytesRead=m_SerialPort.read(data, NBUFFER);
		if (bytesRead == NBUFFER)
		{
			m_data_received = QByteArray::fromRawData(data,NBUFFER);
		}
		else
		{
			m_data_received = QByteArray::fromRawData(data,bytesRead);
		}
		cout<<m_data_received.size();

		if (ui.chbRecHex->isChecked())
		{
			for (int i=0;i<m_data_received.size();i++)
			{
				m_data_hex.sprintf(" %2X",m_data_received.at(i));
				ui.edtReceive->insertPlainText(m_data_hex);
			}
		}
		else
		{
			ui.edtReceive->insertPlainText(m_data_received);
		}
	} while(bytesRead == NBUFFER);

}

void QtComAssist::on_btnLoad_clicked()
{
	QString fileName = QFileDialog::getOpenFileName(this,
		tr("open"),
		QDir::currentPath(),
		tr("All Files (*);;Text Files (*.txt)")
		);
	if (!fileName.isEmpty())
	{
		QFile ifile(fileName);
		if (ifile.open(QFile::ReadOnly))
		{
			QTextStream in(&ifile);
			QString strText = in.readAll();
			ui.edtSend->setText(strText);
			ifile.close();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -