在关闭串口的slot7函数中,需要添加一个判断语句来判断是否成功关闭了串口。如果成功关闭串口,再去打开串口。修改后的代码如下所示:

void Sensor_v1::slot7() //关闭串口
{
	CloseHandle(hCom);
	QString labeltext3 = QStringLiteral("串口状态:关闭");
	ui.label_3->setText(labeltext3);
	QString text = QStringLiteral("串口关闭成功!");
	emit sendtext(text); //传出子窗体信号
	newW->show();

	// 打开串口
	hCom = CreateFile(L"\\\\.\\COM5", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hCom == INVALID_HANDLE_VALUE)
	{
		QString text = QStringLiteral("串口打开失败!");
		emit sendtext(text); //传出子窗体信号
		newW->show();
	}
	else
	{
		QString labeltext3 = QStringLiteral("串口状态:打开"), labeltext4 = QStringLiteral("COM5");
		ui.label_3->setText(labeltext3);
		ui.label_4->setText(labeltext4);
		QString text = QStringLiteral("串口打开成功!");
		emit sendtext(text); //传出子窗体信号
		newW->show();
	}

	//设备属性值 获取+修改+设置
	DCB mDCB;
	GetCommState(hCom, &mDCB);
	mDCB.Parity = NOPARITY;
	mDCB.ByteSize = 8;
	mDCB.StopBits = ONESTOPBIT;
	mDCB.BaudRate = CBR_9600;
	SetCommState(hCom, &mDCB);

	//设置串口写和读的缓冲区大小
	SetupComm(&mDCB, 1024, 1024);

	//设置超时时间
	COMMTIMEOUTS TimeOuts;
	//设定读超时
	TimeOuts.ReadIntervalTimeout = MAXDWORD;//读间隔超时
	TimeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数
	TimeOuts.ReadTotalTimeoutConstant = 0;//读时间常量
	//设定写超时
	TimeOuts.WriteTotalTimeoutMultiplier = 1;//写时间系数
	TimeOuts.WriteTotalTimeoutConstant = 1;//写时间常量
	SetCommTimeouts(hCom, &TimeOuts); //设置超时

	//在发送和接收前,清空读和写的缓冲区域
	PurgeComm(&mDCB, PURGE_TXCLEAR | PURGE_RXCLEAR);
}

这样就可以在关闭串口后重新打开串口了

HANDLE hCom;void Sensor_v1slot5 打开串口	查看所有串口信息	vectorstring vecCom;	char strCom255 tempCom255;	for int i = 0; i 20; i++			strComFormatCOMd i + 1;		sprintf_sstrCom COMd i + 1;		sprintf_stempCom COMd i

原文地址: https://www.cveoy.top/t/topic/iBtY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录